利用python執行shell指令碼 並動態傳參 及subprocess基本使用

來源:互聯網
上載者:User
本篇文章給大家分享了利用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() 殺死進程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.