欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python 創建子進程模塊subprocess詳解

系統 1658 0

最近,我們老大要我寫一個守護者程序,對服務器進程進行守護。如果服務器不幸掛掉了,守護者能即時的重啟應用程序。上網Google了一下,發現Python有很幾個模塊都可以創建進程。最終我選擇使用subprocess模塊,因為在Python手冊中有這樣一段話:

  This module intends to replace several other, older modules and functions, such as: os.system、os.spawn*、os.popen*、popen2.*、commands.*

  subprocess被用來替換一些老的模塊和函數,如:os.system、os.spawn*、os.popen*、popen2.*、commands.*。可見,subprocess是被推薦使用的模塊。

下面是一個很簡單的例子,創建一個新進程,執行app1.exe,傳入相當的參數,并打印出進程的返回值:

復制代碼 代碼如下:

import subprocess

returnCode = subprocess.call('app1.exe -a -b -c -d')
print 'returncode:', returnCode

#----- 結果 --------
#Python is powerful
#app1.exe
#-a
#-b
#-c
#-d
returncode: 0


app1.exe是一個非常簡單的控制臺程序,它只打印出傳入的參數,代碼如下:
復制代碼 代碼如下:

#include
using namespace std;

int main(int argc, const char *argv[])
{
??? cout << "Python is powerful" << endl;
??? for (int i = 0; i < argc; i++)
??? {
??????? cout << argv[i] << endl;
??? }

??? return 0;
}

 閑話少說,下面開始詳細介紹subprocess模塊。subprocess模塊中只定義了一個類: Popen。可以使用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)

  參數args可以是字符串或者序列類型(如:list,元組),用于指定進程的可執行文件及其參數。如果是序列類型,第一個元素通常是可執行文件的路徑。我們也可以顯式的使用executeable參數來指定可執行文件的路徑。在windows操作系統上,Popen通過調用CreateProcess()來創建子進程,CreateProcess接收一個字符串參數,如果args是序列類型,系統將會通過list2cmdline()函數將序列類型轉換為字符串。
  參數bufsize:指定緩沖。我到現在還不清楚這個參數的具體含義,望各個大牛指點。
  參數executable用于指定可執行程序。一般情況下我們通過args參數來設置所要運行的程序。如果將參數shell設為True,executable將指定程序使用的shell。在windows平臺下,默認的shell由COMSPEC環境變量來指定。
  參數stdin, stdout, stderr分別表示程序的標準輸入、輸出、錯誤句柄。他們可以是PIPE,文件描述符或文件對象,也可以設置為None,表示從父進程繼承。
  參數preexec_fn只在Unix平臺下有效,用于指定一個可執行對象(callable object),它將在子進程運行之前被調用。
  參數Close_sfs:在windows平臺下,如果close_fds被設置為True,則新創建的子進程將不會繼承父進程的輸入、輸出、錯誤管道。我們不能將close_fds設置為True同時重定向子進程的標準輸入、輸出與錯誤(stdin, stdout, stderr)。
  如果參數shell設為true,程序將通過shell來執行。
  參數cwd用于設置子進程的當前目錄。
  參數env是字典類型,用于指定子進程的環境變量。如果env = None,子進程的環境變量將從父進程中繼承。
  參數Universal_newlines:不同操作系統下,文本的換行符是不一樣的。如:windows下用'/r/n'表示換,而Linux下用'/n'。如果將此參數設置為True,Python統一把這些換行符當作'/n'來處理。
  參數startupinfo與createionflags只在windows下用效,它們將被傳遞給底層的CreateProcess()函數,用于設置子進程的一些屬性,如:主窗口的外觀,進程的優先級等等。

subprocess.PIPE
  在創建Popen對象時,subprocess.PIPE可以初始化stdin, stdout或stderr參數。表示與子進程通信的標準流。

subprocess.STDOUT
  創建Popen對象時,用于初始化stderr參數,表示將錯誤通過標準輸出流輸出。


Popen的方法:
Popen.poll()
  用于檢查子進程是否已經結束。設置并返回returncode屬性。
Popen.wait()
  等待子進程結束。設置并返回returncode屬性。
Popen.communicate(input=None)
  與子進程進行交互。向stdin發送數據,或從stdout和stderr中讀取數據。可選參數input指定發送到子進程的參數。Communicate()返回一個元組:(stdoutdata, stderrdata)。注意:如果希望通過進程的stdin向其發送數據,在創建Popen對象的時候,參數stdin必須被設置為PIPE。同樣,如果希望從stdout和stderr獲取數據,必須將stdout和stderr設置為PIPE。
Popen.send_signal(signal)
  向子進程發送信號。
Popen.terminate()
  停止(stop)子進程。在windows平臺下,該方法將調用Windows API TerminateProcess()來結束子進程。
Popen.kill()
  殺死子進程。
Popen.stdin
  如果在創建Popen對象是,參數stdin被設置為PIPE,Popen.stdin將返回一個文件對象用于策子進程發送指令。否則返回None。
Popen.stdout
  如果在創建Popen對象是,參數stdout被設置為PIPE,Popen.stdout將返回一個文件對象用于策子進程發送指令。否則返回None。
Popen.stderr
  如果在創建Popen對象是,參數stdout被設置為PIPE,Popen.stdout將返回一個文件對象用于策子進程發送指令。否則返回None。
Popen.pid
  獲取子進程的進程ID。
Popen.returncode
  獲取進程的返回值。如果進程還沒有結束,返回None。
?下面是一個非常簡單的例子,來演示supprocess模塊如何與一個控件臺應用程序進行交互。

?

復制代碼 代碼如下:

?import subprocess

p = subprocess.Popen("app2.exe", stdin = subprocess.PIPE, /
??? stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False)

p.stdin.write('3/n')
p.stdin.write('4/n')
print p.stdout.read()

#---- 結果 ----
input x:
input y:
3 + 4 = 7
?

?app2.exe也是一個非常簡單的控制臺程序,它從界面上接收兩個數值,執行加操作,并將結果打印到控制臺上。代碼如下:
?

復制代碼 代碼如下:

?#include
using namespace std;

int main(int argc, const char *artv[])
{
??? int x, y;
??? cout << "input x: " << endl;
??? cin >> x;
??? cout << "input y: " << endl;
??? cin >> y;
??? cout << x << " + " << y << " = " << x + y << endl;

??? return 0;
}
?

? supprocess模塊提供了一些函數,方便我們用于創建進程。
subprocess.call(*popenargs, **kwargs)
  運行命令。該函數將一直等待到子進程運行結束,并返回進程的returncode。文章一開始的例子就演示了call函數。如果子進程不需要進行交互,就可以使用該函數來創建。
subprocess.check_call(*popenargs, **kwargs)
  與subprocess.call(*popenargs, **kwargs)功能一樣,只是如果子進程返回的returncode不為0的話,將觸發CalledProcessError異常。在異常對象中,包括進程的returncode信息。
?
  subprocess模塊的內容就這么多。在Python手冊中,還介紹了如何使用subprocess來替換一些老的模塊,老的函數的例子。趕興趣的朋友可以看一下。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美日韩在线免费观看 | 色视频在线免费观看 | 奇米影视亚洲春色 | 亚洲日韩视频免费观看 | 91撸吧 | 一区二区欧美视频 | aⅴ免费在线观看 | 国产sm主人调教女m视频 | a级片在线视频 | 成人欧美日韩一区二区三区 | 超级碰碰碰视频在线观看 | 91视频区 | 欧日韩视频 | 精品日韩在线观看 | 国产成人无码网站m3u8 | 狠狠色丁香婷婷综合橹不卡 | 91成人久久 | 亚洲欧洲日韩国产aa色大片 | 久久久久久91香蕉国产 | 亚洲人和日本人jizz | 国产视频精品免费 | 99这里只有精品6 | 精品免费久久久久欧美亚一区 | 欧美精品一区二区三区在线 | 亚洲精品久久婷婷丁香51 | 欧美金妇欧美乱妇视频 | 国产1区2 | 国产精品久久久久久一级毛片 | 玖玖精品在线观看 | 成人av一区二区三区 | wwwwxxxx免费| jzzjlzz亚洲乱熟在线播放 | 鲁丝片一区二区三区毛片 | 激情网站| 久久综合九色综合网站 | 视频一区二区三区免费观看 | 色偷偷精品视频在线播放放 | 国产精品夜夜爽 | 李旭个人资料及简介 | 性视频久久 | 日韩电影免费观 |