Posted on 2013-05-10 21:26
Onway 閱讀(2773)
評論(0) 編輯 收藏 引用 所屬分類:
碼兒快跑
python程序里面需要執(zhí)行一個系統(tǒng)命令程序,如果命令在限定時間之內(nèi)結束,則python程序讀取其輸出(如果有)并馬上返回,否則強行終止命令程序。
原本這個功能是用系統(tǒng)信號SIGALARM和python的異常解決的,但這不能用在多線程的環(huán)境里。然后考慮用threading.Timer進行計時,但這個計時是在一個單獨線程進行的,如何將超時信息傳給主線程也是一個問題。
百度一下,用select可以解決需求:
但select并不完美,當命令程序輸出的內(nèi)容多于管道容量的時候,select就會返回,如果此時命令程序再進入阻塞,則時間限制就不起作用了。
select.py:
import select
import subprocess
popen = subprocess.Popen("./test.sh", stdout=subprocess.PIPE)
fs = select.select([popen.stdout], [], [], 3)
if popen.stdout in fs[0]:
output = popen.stdout.read()
print len(output)
else:
print "timeout"
test.sh:
#!/bin/bash
# a.txt contains 65536 characters
cat a.txt
sleep 10
cat a.txt