Python:带超时运行进程并捕获标准输出、标准错误和退出状态

9 投票
2 回答
12391 浏览
提问于 2025-04-15 15:01

可能重复的问题:
带超时的子进程

在Python中,最简单的方法来做到以下几点是什么:

  • 运行一个外部程序
  • 把标准输出(stdout)捕获到一个字符串中,同时捕获标准错误(stderr)和退出状态
  • 设置一个超时时间。

我想要的类似于这样:

import proc

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

2 个回答

12

注意,在使用版本大于等于7.0的coreutils的Linux系统上,你可以在命令前加上timeout,像这样:

timeout 1 sleep 1000
13

我不喜欢自己一个人做这些工作。你只需要把这个复制到你的 proc.py 模块里就行了。

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

撰写回答