使用python執(zhí)行shell腳本 并動(dòng)態(tài)傳參 及subprocess的使用詳解
最近工作需求中 有遇到這個(gè)情況 在web端獲取配置文件內(nèi)容 及 往shell 腳本中動(dòng)態(tài)傳入?yún)?shù)
執(zhí)行shell腳本這個(gè)有多種方法 最后還是選擇了subprocess這個(gè)python標(biāo)準(zhǔn)庫(kù)
subprocess這個(gè)模塊可以非常方便的啟動(dòng)一個(gè)子進(jìn)程,并且控制其輸入和輸出
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):
參數(shù)是:
args 應(yīng)該是一個(gè)字符串,或一系列程序參數(shù)。要執(zhí)行的程序通常是args序列或字符串中的第一項(xiàng),但可以使用可執(zhí)行參數(shù)進(jìn)行顯式設(shè)置。
在UNIX上,與shell=False(默認(rèn)):在這種情況下,POPEN 類(lèi)使用os.execvp()來(lái)執(zhí)行子程序。 args通常應(yīng)該是一個(gè)序列。一個(gè)字符串將被視為一個(gè)字符串作為唯一項(xiàng)目(要執(zhí)行的程序)的序列。
在UNIX上,使用shell = True:如果args是一個(gè)字符串,則它指定要通過(guò)shell執(zhí)行的命令字符串。如果args是一個(gè)序列,則第一個(gè)項(xiàng)目指定命令字符串,并且任何其他項(xiàng)目將被視為附加的shell參數(shù)。
可以先創(chuàng)建一個(gè)簡(jiǎn)單的shell腳本 a.sh
$1 $2 分別代表傳進(jìn)腳本的 第一個(gè)和第二個(gè)參數(shù)
如果不寫(xiě)shell=True,默認(rèn)為shell=False,需要在args的第一個(gè)參數(shù)指定執(zhí)行器路徑
bufsize 如果給出,bufsize與內(nèi)建的open()函數(shù)的相應(yīng)參數(shù)具有相同的含義:0表示無(wú)緩沖,1表示行緩沖,任何其他正值意味著使用(大約)該大小的緩沖區(qū)。負(fù)bufsize意味著使用系統(tǒng)默認(rèn)值,通常意味著完全緩沖。bufsize的默認(rèn)值是0(無(wú)緩沖)。
stdin,stdout和stderr分別指定執(zhí)行的程序的標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤文件句柄。有效值是PIPE,現(xiàn)有文件描述符(正整數(shù)),現(xiàn)有文件對(duì)象和 None。 PIPE表示應(yīng)該創(chuàng)建一個(gè)新的管道給孩子。隨著無(wú),則不會(huì)發(fā)生重定向; 孩子的文件句柄將從父類(lèi)繼承。另外,stderr 可以是STDOUT,它表示應(yīng)用程序的stderr數(shù)據(jù)應(yīng)該被捕獲到與stdout相同的文件句柄中。
在Popen對(duì)象中,可以設(shè)值subprocess.stdout=PIPE 即通過(guò)管道 p.stdout.read()取出 該進(jìn)程的標(biāo)準(zhǔn)輸出
preexec_fn 如果將preexec_fn設(shè)置為可調(diào)用對(duì)象,則該對(duì)象將在子進(jìn)程執(zhí)行前被調(diào)用。
如果close_fds為true,則在執(zhí)行子進(jìn)程之前,將關(guān)閉除0,1和2之外的所有文件描述符。
如果shell為true,則指定的命令將通過(guò)shell執(zhí)行。
如果cwd不是None,那么在執(zhí)行子代之前,當(dāng)前目錄將更改為cwd。
如果env不是None,它將為新進(jìn)程定義環(huán)境變量。
如果設(shè)置universal_newlines為true,則文件對(duì)象stdout和stderr將作為文本文件打開(kāi),但可能會(huì)有\(zhòng) n,Unix行尾約定\ r,Macintosh約定或\ r \ n中的任何行終止, Windows約定。所有這些外部表示被Python程序視為\ n。注意:此功能僅在Python是使用通用換行支持(默認(rèn))構(gòu)建時(shí)才可用。此外,文件對(duì)象stdout,stdin和stderr的newlines屬性不會(huì)被communications()方法更新。
如果設(shè)置了STARTUPINFO和creationflags,將被傳遞到下層的CreateProcess()函數(shù)。他們可以指定諸如主窗口的外觀和新過(guò)程的優(yōu)先級(jí)等內(nèi)容。(僅限Windows)
Popen對(duì)象的一些方法
Popen.poll() 檢查子進(jìn)程是否終止,返回對(duì)象的returncode
Popen.wait() 等待子進(jìn)程完成,阻塞。返回returncode
Popen.communicate(input=None) 將信息輸入到進(jìn)程,從stdout和stderr中讀取數(shù)據(jù),直到達(dá)到文件結(jié)尾。等待進(jìn)程終止??蛇x的stdin參數(shù)應(yīng)該是要發(fā)送到子進(jìn)程的字符串,如果沒(méi)有數(shù)據(jù)應(yīng)發(fā)送給子進(jìn)程,則為None。
返回一個(gè)元組(stdout,stderr) 但是讀取的數(shù)據(jù)緩存在內(nèi)存中,所以如果數(shù)據(jù)量很大或者無(wú)限,就不要使用這種方法
Popen.pid 返回子進(jìn)程的pid
Popen.returncode 讀取進(jìn)程的狀態(tài)碼
None —— 子進(jìn)程尚未結(jié)束;
==0 —— 子進(jìn)程正常退出;
> 0—— 子進(jìn)程異常退出,returncode對(duì)應(yīng)于出錯(cuò)碼;
< 0—— 子進(jìn)程被信號(hào)殺掉了。
Popen.kill() 殺死進(jìn)程
以上這篇使用python執(zhí)行shell腳本 并動(dòng)態(tài)傳參 及subprocess的使用詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python爬蟲(chóng)實(shí)現(xiàn)vip電影下載的示例代碼
這篇文章主要介紹了Python爬蟲(chóng)實(shí)現(xiàn)vip電影下載的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04python3+pyqt5+itchat微信定時(shí)發(fā)送消息的方法
今天小編就為大家分享一篇python3+pyqt5+itchat微信定時(shí)發(fā)送消息的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02Python如何查找文件夾中含有指定關(guān)鍵字的文件
這篇文章主要介紹了Python如何查找文件夾中含有指定關(guān)鍵字的文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08python 使用poster模塊進(jìn)行http方式的文件傳輸?shù)椒?wù)器的方法
今天小編就為大家分享一篇python 使用poster模塊進(jìn)行http方式的文件傳輸?shù)椒?wù)器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01PyQt5+pycharm開(kāi)發(fā)環(huán)境搭建的實(shí)現(xiàn)步驟(圖文)
本文針對(duì)創(chuàng)建PyQt運(yùn)行環(huán)境+PyCharm開(kāi)發(fā)環(huán)境的過(guò)程進(jìn)行記錄,文中通過(guò)圖片示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11pycharm 取消默認(rèn)的右擊運(yùn)行unittest的方法
今天小編就為大家分享一篇pycharm 取消默認(rèn)的右擊運(yùn)行unittest的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python使用uuid庫(kù)生成唯一標(biāo)識(shí)ID
這篇文章主要介紹了Python使用uuid模塊生成唯一標(biāo)識(shí)ID,需要的朋友可以參考下2020-02-02Python實(shí)現(xiàn)Linux監(jiān)控的方法
本文通過(guò)實(shí)例代碼給大家介紹了Python實(shí)現(xiàn)Linux監(jiān)控的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05