subprocess 程序使用

2021-09-08 15:46:31 字數 1906 閱讀 8692

同步程序

import subprocess

cmd = ('

tail

', '

/tmp/test.log

')sp = subprocess.popen(cmd, stdout=subprocess.pipe,stderr=subprocess.pipe)

if sp.wait() == 0:

print

'exec command succussful.

'else:

print sp.stderr.read()

非同步程序

import subprocess

cmd = ('

tail

', '

-f', '

/tmp/test.log

')sp = subprocess.popen(cmd, stdout=subprocess.pipe,stderr=subprocess.pipe)

while true:

if sp.poll() is

not none:

print

'exec command completed.

'else:

print sp.stdout.readline()

程序通訊

sp=subprocess.popen("

dir", shell=true, stdout=subprocess.pipe, stderr=subprocess.pipe)

(stdoutput,erroutput) = sp.communicate()

sp.communicate會一直等到程序退出,並將標準輸出和標準錯誤輸出返回,這樣就可以得到子程序的輸出了,上面,標準輸出和標準錯誤輸出是分開的,也可以合併起來,只需要將stderr引數設定為subprocess.stdout就可以了,這樣子:

sp=subprocess.popen("

dir", shell=true, stdout=subprocess.pipe, stderr=subprocess.stdout)

(stdoutput,erroutput) = sp.communicate()

如果你想一行行處理子程序的輸出,也沒有問題:

sp=subprocess.popen("

dir", shell=true, stdout=subprocess.pipe, stderr=subprocess.stdout)

while true:

buff = sp.stdout.readline()

if buff == ''

and sp.poll() != none:

break

else:

print buff

死鎖如果你使用了管道,而又不去處理管道的輸出,那麼小心點,如果子程序輸出資料過多,死鎖就會發生了,比如下面的用法:

sp=subprocess.popen("

longprint

", shell=true, stdout=subprocess.pipe, stderr=subprocess.stdout)

sp.wait()

longprint是乙個假想的有大量輸出的程序,那麼在我的xp, python2.5的環境下,當輸出達到4096時,死鎖就發生了。當然,如果我們用sp.stdout.readline或者sp.communicate 去清理輸出,那麼無論輸出多少,死鎖都是不會發生的。或者我們不使用管道,比如不做重定向,或者重定向到檔案,也都是可以避免死鎖的。

subprocess 程序使用

同步程序 import subprocess cmd tail tmp test.log sp subprocess.popen cmd,stdout subprocess.pipe,stderr subprocess.pipe if sp.wait 0 print exec command suc...

subprocess建立守護程序

剛開始我在做爬蟲,爬蟲程式用python程式呼叫,但有時候爬蟲程式會死掉,掛了,所以程式會一直停留在那兒,該怎麼辦呢?我想可以建立乙個堅守程式,讓os.system 呼叫爬蟲程式能在一定時間內未執行完時,強制殺死,並重新開始,但根據結構化程式,順序執行沒辦法做到這一點,我知道肯定需要執行緒機制實現,...

subprocess解決殭屍程序

由於父程序建立子程序是非同步的,雙方不知道各自的執行狀態,而父程序有的時候需要知道子程序退出時的一些資訊,所以 linux提供了一種機制,通過讓子程序退出時向父程序傳送 sigchrd 訊號來告知父程序,子程序已經退出了。同時,父程序通過呼叫 wait 和 waitpid 來獲取子程序的退出資訊。i...