Python subprocess.call with timeout retry



我想重新运行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 文档教程,特别是错误处理。

最新更新