最近,我們老大要我寫一個守護者程序,對服務器進程進行守護。如果服務器不幸掛掉了,守護者能即時的重啟應用程序。上網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 <iostream>
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,表示從父進程繼承。
新聞熱點
疑難解答