首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在超时的情况下使用模块“子进程”

在超时的情况下使用模块“子进程”
EN

Stack Overflow用户
提问于 2009-07-28 00:41:23
回答 31查看 375K关注 0票数 369

下面是运行返回其stdout数据的任意命令的Python代码,或者对非零退出代码引发异常:

代码语言:javascript
复制
proc = subprocess.Popen(
    cmd,
    stderr=subprocess.STDOUT,  # Merge stdout and stderr
    stdout=subprocess.PIPE,
    shell=True)

communicate用于等待进程退出:

代码语言:javascript
复制
stdoutdata, stderrdata = proc.communicate()

subprocess模块不支持超时--停止运行超过X秒的进程的能力--因此,communicate可能要花费很长时间才能运行。

程序中实现超时的最简单的方法是什么?

EN

Stack Overflow用户

发布于 2016-08-23 19:04:00

该解决方案在发生shell=True的情况下杀死进程树,将参数传递给进程(或不传递),具有超时,并获取回调的stdout、stderr和进程输出(kill_proc_tree使用psutil )。这是基于几个解决方案张贴在其中,包括jcollado的。张贴回应的评论,由Anson和jradice在jcollado的答复。在Windows 2012和Ubuntu 14.04中进行了测试。请注意,对于Ubuntu,您需要更改parent.children(.)呼叫parent.get_children(.)。

代码语言:javascript
复制
def kill_proc_tree(pid, including_parent=True):
  parent = psutil.Process(pid)
  children = parent.children(recursive=True)
  for child in children:
    child.kill()
  psutil.wait_procs(children, timeout=5)
  if including_parent:
    parent.kill()
    parent.wait(5)

def run_with_timeout(cmd, current_dir, cmd_parms, timeout):
  def target():
    process = subprocess.Popen(cmd, cwd=current_dir, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)

    # wait for the process to terminate
    if (cmd_parms == ""):
      out, err = process.communicate()
    else:
      out, err = process.communicate(cmd_parms)
    errcode = process.returncode

  thread = Thread(target=target)
  thread.start()

  thread.join(timeout)
  if thread.is_alive():
    me = os.getpid()
    kill_proc_tree(me, including_parent=False)
    thread.join()
票数 1
EN
查看全部 31 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1191374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档