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

不言
發布: 2018-04-26 14:47:59
原創
4829 人瀏覽過

這篇文章跟大家分享了利用python執行shell腳本並動態傳​​參 及subprocess基本使用,有感興趣的小伙伴可以看一看

最近工作需求中有遇到這個情況 在web端取得設定檔內容及往shell 腳本中動態傳入參數

執行shell腳本這個有多種方法  最後還是選擇了subprocess這個python標準函式庫

 subprocess這個模組可以非常方便的啟動子程序,並且控制其輸入和輸出

Class Popen(args,bufsize = 0,executable=None,
            stdin =None,stdout =None,stderr =None,#¥  stdin =None,st = None,close_fds = False,shell = False,
            cwd = None,env = None,universal_newlines = False,
          一個字串,或一系列程式參數。要執行的程式通常是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() 殺死進程

相關推薦:

#基於Python Shell取得hostname和fqdn釋疑


########################### ##bpython 功能強大的Python shell###############

以上是利用python執行shell腳本 並動態傳參 及subprocess基本使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!