這可能已經問,但使用Python 2.7如何使用python 2.7.6創建subprocess.call超時?
回答
當在蟒蛇3.3 超時加入的說法我無法找到關於subprocess.call超時東西。
https://docs.python.org/3/library/subprocess.html#subprocess.call
感謝您response.I知道我們使用Python 2.7.6 – user3484496
你可以安裝subprocess32
modulementioned by @gps - 在subprocess
模塊在Python 3.2/3.3的反向移植對2.x的使用它適用於Python 2.7,它包含來自Python 3.3的超時支持。
subprocess.call()
is just Popen().wait()
,因此在timeout
秒中斷一個長期運行的進程:
#!/usr/bin/env python
import time
from subprocess import Popen
p = Popen(*call_args)
time.sleep(timeout)
try:
p.kill()
except OSError:
pass # ignore
p.wait()
如果子過程可以結束越早則便攜式解決方案是use Timer()
as suggested in @sussudio's answer:
#!/usr/bin/env python
from subprocess import Popen
from threading import Timer
def kill(p):
try:
p.kill()
except OSError:
pass # ignore
p = Popen(*call_args)
t = Timer(timeout, kill, [p])
t.start()
p.wait()
t.cancel()
在Unix上,你可以use SIGALRM
as suggested in @Alex Martelli's answer:
#!/usr/bin/env python
import signal
from subprocess import Popen
class Alarm(Exception):
pass
def alarm_handler(signum, frame):
raise Alarm
signal.signal(signal.SIGALRM, alarm_handler)
p = Popen(*call_args)
signal.alarm(timeout) # raise Alarm in 5 minutes
try:
p.wait()
signal.alarm(0) # reset the alarm
except Alarm:
p.kill()
p.wait()
爲了避免在這裏使用線程和信號,Python 3上的subprocess
模塊使用busy loop with waitpid(WNOHANG)
calls on Unix和winapi.WaitForSingleObject()
on Windows。
我總是用2.7來實現超時的一個簡單方法是利用subprocess.poll()
以及time.sleep()
延遲。這裏是一個非常簡單的例子:
import subprocess
import time
x = #some amount of seconds
delay = 1.0
timeout = int(x/delay)
args = #a string or array of arguments
task = subprocess.Popen(args)
#while the process is still executing and we haven't timed-out yet
while task.poll() is None and timeout > 0:
#do other things too if necessary e.g. print, check resources, etc.
time.sleep(delay)
timeout -= delay
如果設置x = 600
,那麼您的超時時間將達到10分鐘。而task.poll()
將查詢過程是否已終止。在這種情況下,time.sleep(delay)
將休眠1秒,然後將超時遞減1秒。你可以隨心所欲地玩弄這個部分,但基本概念始終是一樣的。
希望這會有所幫助!
subprocess.poll()
https://docs.python.org/2/library/subprocess.html#popen-objects
這並未不會殺死這個過程。你需要添加os.killpg(os.getpgid(task.pid),signal.SIGTERM) – AaronS
- 1. 如何使用python SocketServer創建連接超時
- 2. 如何使用subprocess.call()
- 3. Python subprocess.call()在使用pythonw.exe時失敗
- 4. Python 2.7.6字典
- 5. 使用時間和difftime創建超時
- 6. Python 2.7.6雖然和如果
- 7. IDEA:如何使用超類創建toString()
- 8. 如何使用XSLT創建超鏈接?
- 9. 如何在python 2.7.6中導入_ssl?
- 10. Python 2.7.6:如何正確清理類?
- 11. 如何創建超(...)
- 12. 安裝python mac 2.7.6
- 13. 如何使用jquery創建通用超時函數
- 14. 何時使用subprocess.call()或subprocess.Popen(),運行airodump
- 15. 用subprocess.call使用shebang執行python腳本
- 16. subprocess.call vs os.system python
- 17. 使用ProcessClusterEventTimeoutException索引創建超時
- 18. 使用超時創建網絡通知
- 19. 用超時創建任務
- 20. 如何創建遞歸超時函數
- 21. 導入anydbm時出錯python 2.7.6
- 22. 如何使用超時在WP7中創建後臺線程?
- 23. python 2.7.6在使用循環時垂直打印字符串
- 24. Python subprocess.call - 添加一個變量到subprocess.call
- 25. 在python中使用subprocess.call的多堆stdin
- 26. 無法rm -r目錄使用python subprocess.call
- 27. python,使用glob與cwd參數subprocess.call
- 28. 使用Python的subprocess.call殺Firefox進程
- 29. 2.7.6
- 30. 如何在Python中調試到subprocess.call()?
看看到:http://stackoverflow.com/questions/1191374/subprocess-with-timeout – Mortezaipo