1. 程式人生 > >python:程序subprocess與管道pipe

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 subprocess

def 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複製程式碼