1. 程式人生 > >[python]subprocess模組學習-call, checkall, check_output, Popen

[python]subprocess模組學習-call, checkall, check_output, Popen

在Python中,我們通過使用標準庫中的subprocess模組來fork一個子程序,並執行一個外部的程式(類似於在linux中fork一個子程序,然後在子程序中exec另外一個程式)。

這一模組中提供了多種方法:

1. subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

1.1 引數args描述了子程序中需要執行的命令;

1.2 父程序會等待子程序的結束,並獲得call函式的返回值

import subprocess

cmd = ['ls', '-l];
ret = subprocess.call(cmd)

cmd = ['exit 1'];
ret = subprocess.call(cmd, shell=True);
1.3 如果子程序不需要進行互動,就可以使用該函式來建立

2. subprocess.check_all(args, *, stdin=None, stdout=None, stderr=None, shell=False) 

2.1 check_all()與call()唯一的區別在於返回值。如果args執行之後的返回值為0,那麼check_all返回0;如果返回值不為0,那麼將raise出來一個CalledProcessError

3. subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

3.1 子程序執行args中的命令,並將其輸出形成字串返回

3.2 如果返回值非零,那麼將raise一個CalledProcessError。這一物件例項中有returncode屬性以及output屬性(args命令的output)

4. subprocess.Popen()

4.1 詳細格式:class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

4.2 Popen物件建立後,主程式不會自動等待子程序完成。我們必須呼叫物件的wait()方法,父程序才會等待 (也就是阻塞block)

4.3 Popen中封裝的其他函式:

4.3.1 Popen.poll():檢查子程序的狀態,檢視子程序是否結束

4.3.2 Popen.wait():等待子程序的結束

4.3.3 Popen.communicate(input=None):與子程序進行互動。向stdin傳送資料,或從stdout和stderr中讀取資料。可選引數input指定傳送到子程序的引數。Communicate()返回一個元組:(stdoutdata, stderrdata)。注意:如果希望通過程序的stdin向其傳送資料,在建立Popen物件的時候,引數stdin必須被設定為PIPE。同樣,如果希望從stdout和stderr獲取資料,必須將stdout和stderr設定為PIPE。

4.3.4 Popen.send_signal(signal):向子程序傳送訊號

4.3.5 Popen.terminate():停止(stop)子程序。在windows平臺下,該方法將呼叫Windows API TerminateProcess()來結束子程序

4.3.6 Popen.kill():殺死子程序

4.3.7 Popen.stdin:如果在建立Popen物件是,引數stdin被設定為PIPE,Popen.stdin將返回一個檔案物件用於策子程序傳送指令;否則返回None

4.3.8 Popen.stdout:如果在建立Popen物件是,引數stdout被設定為PIPE,Popen.stdout將返回一個檔案物件用於策子程序傳送指令;否則返回None

4.3.9 Popen.stderr果在建立Popen物件是,引數stdout被設定為PIPE,Popen.stdout將返回一個檔案物件用於策子程序傳送指令;否則返回None

4.3.10 Popen.pid:獲取子程序的程序ID

4.3.11 Popen.returncode:獲取程序的返回值。如果程序還沒有結束,返回None

更詳細的資訊:http://docs.python.org/2/library/subprocess.html