关于python:当我使用子进程时如何超时

How to timeout when I use subprocess

本问题已经有最佳答案,请猛点这里访问。

我在Python2.7中使用sub.Popen

但是,Python3有超时但是,Python2.7不能。

这是我的片段。

1
2
3
4
5
6
7
8
9
10
11
12
proc = sub.Popen(['some command', 'some params'], stdout=sub.PIPE)    

try:
    for row in proc.stdout:
        print row.rstrip()   # process here
        result = str(row.rstrip())
        count += 1
        if count > 10:
            break
except:
    print 'tcpdump error'
    proc.terminate()

如何设置超时。


根据此博客文章代码进行一些更改,您可以使用threading.Thread:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from threading import Thread
from subprocess import PIPE, Popen


def proc_timeout(secs, *args):
    proc = Popen(args, stderr=PIPE, stdout=PIPE)
    proc_thread = Thread(target=proc.wait)
    proc_thread.start()
    proc_thread.join(secs)
    if proc_thread.is_alive():
        try:
            proc.kill()
        except OSError:
            return proc.returncode
        print('Process #{} killed after {} seconds'.format(proc.pid, secs))
    return proc

您应该只在try / except中捕获特定的异常,不要试图捕获所有异常。


如果您使用的是Linux(或可能是其他unix衍生产品),您可以使用timeout命令。 例如:

1
subprocess.Popen(['timeout', '5', 'sleep', '20']).wait()

5秒后会超时。 proc.communicate()也应该使用此方法。

在这个相关问题中可以找到其他替代方案:使用带有超时的模块"子进程"