Posted on 2013-05-10 21:26
Onway 閱讀(2766)
評論(0) 編輯 收藏 引用 所屬分類:
碼兒快跑
python程序里面需要執行一個系統命令程序,如果命令在限定時間之內結束,則python程序讀取其輸出(如果有)并馬上返回,否則強行終止命令程序。
原本這個功能是用系統信號SIGALARM和python的異常解決的,但這不能用在多線程的環境里。然后考慮用threading.Timer進行計時,但這個計時是在一個單獨線程進行的,如何將超時信息傳給主線程也是一個問題。
百度一下,用select可以解決需求:
但select并不完美,當命令程序輸出的內容多于管道容量的時候,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