天天看點

12Python标準庫系列之subprocess子產品Python标準庫系列之subprocess子產品

This module allows you to spawn processes, connect to their input/output/error pipes, and obtain their return codes.

call()

執行指令,并傳回狀态碼,狀态碼<code>0</code>代表指令執行成功,其他的都表示指令執行不成功

<code>&gt;&gt;&gt; ret </code><code>=</code> <code>subprocess.call([</code><code>"ls"</code><code>, </code><code>"-l"</code><code>], shell</code><code>=</code><code>False</code><code>)</code>

<code>total </code><code>4</code>

<code>-</code><code>rw</code><code>-</code><code>r</code><code>-</code><code>-</code><code>r</code><code>-</code><code>-</code> <code>1</code> <code>root root </code><code>172</code> <code>May </code><code>25</code> <code>21</code><code>:</code><code>21</code> <code>file</code><code>.conf</code>

<code>&gt;&gt;&gt; ret</code>

<code>0</code>

另一種執行方式

<code># shell=True表示調用原生的shell指令去執行</code>

<code>&gt;&gt;&gt; ret </code><code>=</code> <code>subprocess.call(</code><code>"ls -l"</code><code>, shell</code><code>=</code><code>True</code><code>)</code>

check_call()

執行指令,如果執行狀态碼是0,則傳回0,否則抛異常

<code># 執行一個正确的指令就會傳回執行結果和狀态碼</code>

<code>&gt;&gt;&gt; subprocess.check_call([</code><code>"ls"</code><code>, </code><code>"-l"</code><code>])</code>

<code># 如果執行的是一個錯誤的指令,那麼就會傳回錯誤資訊</code>

<code>&gt;&gt;&gt; subprocess.check_call([</code><code>"ls"</code><code>, </code><code>"a"</code><code>])  </code>

<code>ls: cannot access a: No such </code><code>file</code> <code>or</code> <code>directory</code>

<code>Traceback (most recent call last):</code>

<code>  </code><code>File</code> <code>"&lt;stdin&gt;"</code><code>, line </code><code>1</code><code>, </code><code>in</code> <code>&lt;module&gt;</code>

<code>  </code><code>File</code> <code>"/usr/lib64/python2.6/subprocess.py"</code><code>, line </code><code>505</code><code>, </code><code>in</code> <code>check_call</code>

<code>    </code><code>raise</code> <code>CalledProcessError(retcode, cmd)</code>

<code>subprocess.CalledProcessError: Command </code><code>'['</code><code>ls</code><code>', '</code><code>a</code><code>']'</code> <code>returned non</code><code>-</code><code>zero exit status </code><code>2</code>

check_output()

執行指令,如果狀态碼是0,則傳回執行結果,否則抛異常

<code># 執行成功就把執行的結果指派給變量V</code>

<code>&gt;&gt;&gt; V </code><code>=</code> <code>subprocess.check_output(</code><code>"python -V"</code><code>, shell</code><code>=</code><code>True</code><code>)</code>

<code># 執行錯誤的指令就會輸出異常</code>

<code>&gt;&gt;&gt; subprocess.check_output(</code><code>"pasas"</code><code>, shell</code><code>=</code><code>True</code><code>)</code>

<code>'pasas'</code> <code>不是内部或外部指令,也不是可運作的程式</code>

<code>或批處理檔案。</code>

<code>  </code><code>File</code> <code>"C:\Python35\lib\subprocess.py"</code><code>, line </code><code>629</code><code>, </code><code>in</code> <code>check_output</code>

<code>    </code><code>*</code><code>*</code><code>kwargs).stdout</code>

<code>  </code><code>File</code> <code>"C:\Python35\lib\subprocess.py"</code><code>, line </code><code>711</code><code>, </code><code>in</code> <code>run</code>

<code>    </code><code>output</code><code>=</code><code>stdout, stderr</code><code>=</code><code>stderr)</code>

<code>subprocess.CalledProcessError: Command </code><code>'pasas'</code> <code>returned non</code><code>-</code><code>zero exit status </code><code>1</code>

以上的三種執行方式在執行指令的時候,<code>shell</code>預設等于<code>True</code>,等于<code>True</code>的時候,括号内的指令是一行的,如果<code>shell</code>等于<code>False</code>,那麼<code>[]</code>内的字元串就是指令的一個元素,執行的時候會把<code>[]</code>内的字元串拼接起來執行。

subprocess.Popen()

<code>call()</code>、<code>check_call()</code>、<code>check_output()</code>預設内部調用的都是<code>subprocess.Popen()</code>,而<code>subprocess.Popen()</code>則用于執行更複雜的系統指令。

參數

說明

stdin

标準輸入

stdout

标準輸出

stderr

錯誤句柄

cwd

用于設定子程序的目前目錄

env

用于指定子程序的環境變量。如果env = None,子程序的環境變量将從父程序中繼承

執行普通指令

<code>&gt;&gt;&gt; subprocess.Popen(</code><code>"Python -V"</code><code>, shell</code><code>=</code><code>True</code><code>)</code>

<code>&lt;subprocess.Popen </code><code>object</code> <code>at </code><code>0x0000025C97233C88</code><code>&gt;</code>

<code># Python 3.5.1是輸出出來的結果</code>

<code>&gt;&gt;&gt; Python </code><code>3.5</code><code>.</code><code>1</code>

執行指令分為兩種:

輸入即可得到輸出,如:ifconfig

輸入進行某互動式環境,依賴再輸入,如:python

<code>&gt;&gt;&gt; </code><code>import</code> <code>subprocess</code>

<code># 先進入'/tmp'目錄,然後在建立subprocess檔案夾,shell=True可有可無</code>

<code>&gt;&gt;&gt; subprocess.Popen(</code><code>"mkdir subprocess"</code><code>, shell</code><code>=</code><code>True</code><code>, cwd</code><code>=</code><code>'/tmp'</code><code>,)</code>

<code>&lt;subprocess.Popen </code><code>object</code> <code>at </code><code>0x7f267cc3d390</code><code>&gt;</code>

<code>&gt;&gt;&gt; </code><code>import</code> <code>os</code>

<code>&gt;&gt;&gt; os.system(</code><code>"ls /tmp"</code><code>)</code>

<code>subprocess</code>

<code># 導入subprocess子產品</code>

<code>import</code> <code>subprocess</code>

<code># 執行python指令,進入python解釋器,stdin标準輸入、stdout标準輸出、stderr錯誤輸出,universal_newlines=True自動輸入換行符</code>

<code>obj </code><code>=</code> <code>subprocess.Popen([</code><code>"python"</code><code>], stdin</code><code>=</code><code>subprocess.PIPE, stdout</code><code>=</code><code>subprocess.PIPE, stderr</code><code>=</code><code>subprocess.PIPE, universal_newlines</code><code>=</code><code>True</code><code>)</code>

<code># 執行标準輸入,write後面是輸入的指令</code>

<code>obj.stdin.write(</code><code>"print(1)\n"</code><code>)</code>

<code>obj.stdin.write(</code><code>"print(2)"</code><code>)</code>

<code># 輸入之後關閉</code>

<code>obj.stdin.close()</code>

<code># 讀取标準輸出的内容,指派給cmd_out對象</code>

<code>cmd_out </code><code>=</code> <code>obj.stdout.read()</code>

<code># 關閉标準輸出</code>

<code>obj.stdout.close()</code>

<code># 讀取錯誤輸出的内容,指派給cmd_error對象</code>

<code>cmd_error </code><code>=</code> <code>obj.stderr.read()</code>

<code># 關閉錯誤輸出</code>

<code>obj.stderr.close()</code>

<code># 輸出内容</code>

<code>print</code><code>(cmd_out)</code>

<code>print</code><code>(cmd_error)</code>

執行結果

<code>C:\Python35\python.exe F:</code><code>/</code><code>Python_code</code><code>/</code><code>sublime</code><code>/</code><code>Week5</code><code>/</code><code>Day02</code><code>/</code><code>sub.py</code>

<code>1</code>

<code>2</code>

<code>Process finished with exit code </code><code>0</code>

<code># 執行兩條指令</code>

<code># communicate把錯誤輸出或者标準輸出的内容指派給out_error_list對象,如果有錯誤就指派錯誤輸出,否則就複制标準輸出</code>

<code>out_error_list </code><code>=</code> <code>obj.communicate()</code>

<code># 輸出out_error_list對象的内容</code>

<code>print</code><code>(out_error_list)</code>

<code>(</code><code>'1\n2\n'</code><code>, '')</code>

<code># 直接執行print("hello")指令,然後把錯誤或者正确的結果指派給out_error_list對象</code>

<code>out_error_list </code><code>=</code> <code>obj.communicate(</code><code>'print("hello")'</code><code>)</code>

<code>(</code><code>'hello\n'</code><code>, '')</code>

<code></code>

本文轉自 Edenwy  51CTO部落格,原文連結:http://blog.51cto.com/edeny/1925760,如需轉載請自行聯系原作者