我想重新运行sub-process.call,如果它以某种方式超时。
subprocess.call('some command', timeout=600)
if timeout:
subprocess.call('some command')
我该怎么做这样的事情?
subprocess.call 引发 [Python 3.Docs]:异常子进程。超时当超时(给定和)达到时过期(就像 Popen.communication)。
下面是一段代码,它以 3 秒的超时不断启动记事本,直到它运行 2 次,或者用户手动关闭它:
>>> max_runs = 2 >>> run = 0 >>> while run < max_runs: ... try: ... subprocess.call("notepad", timeout=3) ... except subprocess.TimeoutExpired: ... continue ... else: ... break ... finally: ... run += 1 ... 0
虽然这在技术上回答了这个问题,但我认为重新启动一个没有结束的过程不是一个好主意,因为连续运行很有可能会有相同的结果(将超时)。在这种情况下,你必须使用 Popen 并进行通信,如果进程超时,请通过 Popen.terminate 终止它。
您可以使用基本错误处理来捕获超时异常:
try:
subprocess.call('cmd', timeout=0)
except subprocess.TimeoutExpired:
print('Expired!')
# subprocess.call('cmd')
仅当引发指定的错误时,才会运行except
块。有关详细信息,请参阅有关异常的 Python 文档教程,特别是错误处理。