python:使用超时运行进程并捕获stdout,stderr和退出状态

python: run a process with timeout and capture stdout, stderr and exit status

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

Possible Duplicate:
subprocess with timeout

在Python中执行以下操作的最简单方法是什么:

  • 运行外部流程
  • 捕获字符串,stderr和退出状态中的stdout
  • 设置超时。

我想要这样的东西:

1
2
3
4
5
6
import proc

try:
    status, stdout, stderr = proc.run(["ls","-l"], timeout=10)
except proc.Timeout:
    print"failed"


我不喜欢自己做这项工作。 只需将其复制到proc.py模块即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import subprocess
import time
import sys

class Timeout(Exception):
    pass

def run(command, timeout=10):
    proc = subprocess.Popen(command, bufsize=0, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    poll_seconds = .250
    deadline = time.time()+timeout
    while time.time() < deadline and proc.poll() == None:
        time.sleep(poll_seconds)

    if proc.poll() == None:
        if float(sys.version[:3]) >= 2.6:
            proc.terminate()
        raise Timeout()

    stdout, stderr = proc.communicate()
    return stdout, stderr, proc.returncode

if __name__=="__main__":
    print run(["ls","-l"])
    print run(["find","/"], timeout=3) #should timeout


关于使用coreutils> = 7.0的linux的注意事项,你可以在命令之前添加超时,如:

1
timeout 1 sleep 1000