This module allows you to spawn processes, connect to their input/output/error pipes, and obtain their return codes.
call()
執行指令,并傳回狀态碼,狀态碼<code>0</code>代表指令執行成功,其他的都表示指令執行不成功
<code>>>> 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>>>> ret</code>
<code>0</code>
另一種執行方式
<code># shell=True表示調用原生的shell指令去執行</code>
<code>>>> 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>>>> subprocess.check_call([</code><code>"ls"</code><code>, </code><code>"-l"</code><code>])</code>
<code># 如果執行的是一個錯誤的指令,那麼就會傳回錯誤資訊</code>
<code>>>> 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>"<stdin>"</code><code>, line </code><code>1</code><code>, </code><code>in</code> <code><module></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>>>> 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>>>> 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>>>> subprocess.Popen(</code><code>"Python -V"</code><code>, shell</code><code>=</code><code>True</code><code>)</code>
<code><subprocess.Popen </code><code>object</code> <code>at </code><code>0x0000025C97233C88</code><code>></code>
<code># Python 3.5.1是輸出出來的結果</code>
<code>>>> Python </code><code>3.5</code><code>.</code><code>1</code>
執行指令分為兩種:
輸入即可得到輸出,如:ifconfig
輸入進行某互動式環境,依賴再輸入,如:python
<code>>>> </code><code>import</code> <code>subprocess</code>
<code># 先進入'/tmp'目錄,然後在建立subprocess檔案夾,shell=True可有可無</code>
<code>>>> 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><subprocess.Popen </code><code>object</code> <code>at </code><code>0x7f267cc3d390</code><code>></code>
<code>>>> </code><code>import</code> <code>os</code>
<code>>>> 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,如需轉載請自行聯系原作者