同步程序
import subprocess非同步程序cmd = ('
tail
', '
/tmp/test.log
')sp = subprocess.popen(cmd, stdout=subprocess.pipe,stderr=subprocess.pipe)
if sp.wait() == 0:
'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:
'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...