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衍生产品),您可以使用
1 | subprocess.Popen(['timeout', '5', 'sleep', '20']).wait() |
5秒后会超时。
在这个相关问题中可以找到其他替代方案:使用带有超时的模块"子进程"