python:运行一个超时进程并捕获stdout、stderr和退出状态

发布于 2024-08-08 09:24:31 字数 430 浏览 7 评论 0原文

可能的重复:
超时子进程

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

  • 运行外部进程
  • 捕获标准输出字符串、stderr 和退出状态
  • 设置超时。

我想要这样的东西:

import proc

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

Possible Duplicate:
subprocess with timeout

What is the easiest way to do the following in Python:

  • Run an external process
  • Capture stdout in a string, stderr, and exit status
  • Set a timeout.

I would like something like this:

import proc

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

゛清羽墨安 2024-08-15 09:24:31

我讨厌自己做这项工作。只需将其复制到您的 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

I hate doing the work by myself. Just copy this into your proc.py module.

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
长安忆 2024-08-15 09:24:31

请注意,在 coreutils >= 7.0 的 Linux 上,您可以在命令前面加上超时,例如:

timeout 1 sleep 1000

Note on linux with coreutils >= 7.0 you can prepend timeout to the command like:

timeout 1 sleep 1000
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文