[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函式的返回值
1.3 如果子程序不需要進行互動,就可以使用該函式來建立import subprocess cmd = ['ls', '-l]; ret = subprocess.call(cmd) cmd = ['exit 1']; ret = subprocess.call(cmd, shell=True);
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中封裝的其他函式:
更詳細的資訊:http://docs.python.org/2/library/subprocess.html4.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