本篇文章給大家分享了利用python執行shell指令碼 並動態傳參 及subprocess基本使用,有感興趣的小夥伴可以看一看
最近工作需求中 有遇到這個情況 在web端擷取設定檔內容 及 往shell 指令碼中動態傳入參數
執行shell指令碼這個有多種方法 最後還是選擇了subprocess這個python標準庫
subprocess這個模組可以非常方便的啟動一個子進程,並且控制其輸入和輸出
Class 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):
參數是:
args 應該是一個字串,或一系列程式參數。要執行的程式通常是args序列或字串中的第一項,但可以使用可執行參數進行顯式設定。
在UNIX上,與shell=False(預設):在這種情況下,POPEN 類使用os.execvp()來執行子程式。 args通常應該是一個序列。一個字串將被視為一個字串作為唯一項目(要執行的程式)的序列。
在UNIX上,使用shell = True:如果args是一個字串,則它指定要通過shell執行的命令字串。如果args是一個序列,則第一個項目指定命令字串,並且任何其他項目將被視為附加的shell參數。
可以先建立一個簡單的shell指令碼 a.sh
$1 $2 分別代表傳進指令碼的 第一個和第二個參數
如果不寫shell=True,預設為shell=False,需要在args的第一個參數指定執行器路徑
bufsize 如果給出,bufsize與內建的open()函數的相應參數具有相同的含義:0表示無緩衝,1表示行緩衝,任何其他正值意味著使用(大約)該大小的緩衝區。負bufsize意味著使用系統預設值,通常意味著完全緩衝。bufsize的預設值是0(無緩衝)。
stdin,stdout和stderr分別指定執行的程式的標準輸入,標準輸出和標準錯誤檔案控制代碼。有效值是PIPE,現有檔案描述符(正整數),現有檔案對象和 None。 PIPE表示應該建立一個新的管道給孩子。隨著無,則不會發生重新導向; 孩子的檔案控制代碼將從父類繼承。另外,stderr 可以是STDOUT,它表示應用程式的stderr資料應該被捕獲到與stdout相同的檔案控制代碼中。
在Popen對象中,可以設值subprocess.stdout=PIPE 即通過管道 p.stdout.read()取出 該進程的標準輸出
preexec_fn 如果將preexec_fn設定為可調用對象,則該對象將在子進程執行前被調用。
如果close_fds為true,則在執行子進程之前,將關閉除0,1和2之外的所有檔案描述符。
如果shell為true,則指定的命令將通過shell執行。
如果cwd不是None,那麼在執行子代之前,目前的目錄將更改為cwd。
如果env不是None,它將為新進程定義環境變數。
如果設定universal_newlines為true,則檔案對象stdout和stderr將作為文字檔開啟,但可能會有\ n,Unix行尾約定\ r,Macintosh約定或\ r \ n中的任何行終止, Windows約定。所有這些外部表格示被Python程式視為\ n。注意:此功能僅在Python是使用通用換行支援(預設)構建時才可用。此外,檔案對象stdout,stdin和stderr的newlines屬性不會被communications()方法更新。
如果設定了STARTUPINFO和creationflags,將被傳遞到下層的CreateProcess()函數。他們可以指定諸如主視窗的外觀和新過程的優先順序等內容。(僅限Windows)
Popen對象的一些方法
Popen.poll() 檢查子進程是否終止,返回對象的returncode
Popen.wait() 等待子進程完成,阻塞。返回returncode
Popen.communicate(input=None) 將資訊輸入到進程,從stdout和stderr中讀取資料,直到達到檔案結尾。等待進程終止。可選的stdin參數應該是要發送到子進程的字串,如果沒有資料應發送給子進程,則為None。
返回一個元組(stdout,stderr) 但是讀取的資料緩衝在記憶體中,所以如果資料量很大或者無限,就不要使用這種方法
Popen.pid 返回子進程的pid
Popen.returncode 讀取進程的狀態代碼 None —— 子進程尚未結束;
==0 —— 子進程正常退出;
> 0—— 子進程異常退出,returncode對應於出錯碼;
< 0—— 子進程被訊號殺掉了。
Popen.kill() 殺死進程