python:程序subprocess與管道pipe
一 程式的stdin,stdout,stderr+redirect+pipe
程式的stdin,stdout,stderr:
通常地一個應用程式預設地連線有3個io流,分別為stdin標準輸入流,stdout標準輸出流,stderr標準錯誤輸出流。在程式中我們可以使用它們的控制代碼0,1,2來使用它們。
程式與流的工作過程如下:
從終端的輸入通過標準輸入流傳給程式,程式的輸出傳給標準輸出流,程式的錯誤傳給標準錯誤輸出流。
程式的流的重定向(redirect):
例如將程式的輸入重定向到一個檔案file1,將輸出和錯誤輸出重定向到檔案file2,語句如下:program < file1 > file2 2>&1, 圖示如下:
管道pipe:
用來將一個程式的標準輸出作為另一個程式的輸入,例如:program1 | program2 , 圖示如下:
二 python中subprocess
subprocess的popen函式:
subprocess包含了所有的跟程序有關的操作,subprocess.Popen用來建立新的程序。
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
)
shell引數:
當shell=True時,表示在系統預設的shell環境中執行新的程序,此shell在windows表示為cmd.exe,在linux為/bin/sh。
executable引數:
當指定shell=True時,executable用來修改預設的shell環境,比如executable='/bin/bash'。
stdin,stdout,stderr引數:
預設地stdin,stdout,stderr均為None,此時表示此新程序的stdin,stdout,stderr均為預設,從keyboard獲得輸入,將輸出和錯誤輸出到display。如果stdin設定為PIPE,此時的stdin其實是個file物件,用來提供輸入到新建立的子程序;如果stdout設定為PIPE,此時stdout其實是個file物件,用來儲存新建立的子程序的輸出;如果stderr設定為PIPE,此時的stderr其實是個file物件,用來儲存新建立的子程序的錯誤輸出。
universal_newlines引數:
如果此引數設定為True,則新程序的stdout和stderr將輸出為text,換行為'\n'或'\r'或'\n\r'按照不同的系統平臺。
例項:
import subprocessdef runCommandWithOutput(cmd,stdinstr =''):
p=subprocess.Popen(cmd, shell=True, universal_newlines=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
#p.stdin.write(stdinstr) stdoutdata, stderrdata = p.communicate(stdinstr)
#p.stdin.close()return p.returncode, stdoutdata, stderrdata