带有超时重试的Python subprocess.call

时间:2019-01-21 11:58:25

标签: python python-3.x subprocess

如果超时,我想重新运行subprocess.call。

subprocess.call('some command', timeout=600)
if timeout:
    subprocess.call('some command')

我该怎么做?

2 个答案:

答案 0 :(得分:3)

subprocess.call在达到(给定和)超时(就像Popen.communicate一样)时提高[Python 3]: exception subprocess.TimeoutExpired

这是一段代码,它会以3秒钟的超时持续启动 notepad ,直到运行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 communication ,如果进程超时,请通过Popen.terminate()将其终止。

答案 1 :(得分:1)

您可以使用基本的错误处理来捕获超时异常:

try:
    subprocess.call('cmd', timeout=0)
except subprocess.TimeoutExpired:
    print('Expired!')
    # subprocess.call('cmd')

except块仅在引发指定错误的情况下运行。有关更多信息,请参见Python docs tutorial on exceptions,特别是error handling