Python subprocess包不报告来自子进程的错误?

1 人关注

在某些机器上,对于下面这段代码

p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT);
out, err = p.communicate()

这个脚本会在p.communicate()处挂起,不返回。

在我手动运行命令后,我终于看到了错误信息。

为什么会这样,我应该如何解决这个问题?

5 个评论
错误信息是什么? 如果你尝试不同的命令,是否有同样的问题? 什么是 cmd
你的进程似乎没有终止,communication()方法只是在等待它的发生,正如它所记录的那样。而不是说错误代码是未定义的,直到子进程终止(将此代码返回给操作系统并最终返回给父进程)。
因此,请准确定义你想要实现的交互方案是什么。你是否需要给进程输入数据并捕获输出?例如,如果你只需要等待终止和捕获错误代码, subprocess.call() 就足够了。
@mgilson 那是我自己写的一个脚本,报告一些基本的numpy错误,比如形状不对齐。
@spacediver 但为什么它不会终止呢?它已经抛出了一个未处理的异常。我不需要给它输入,但我需要处理它的输出。
python
linux
subprocess
CuriousMind
CuriousMind
发布于 2012-07-20
2 个回答
User
User
发布于 2012-07-27
已采纳
0 人赞同

我猜你的计划永远不会结束?

当你调用communication()时,它在不同的操作系统下做不同的事情。但它总是等待启动的进程自己退出,例如,调用p.wait()。 p.wait()只有在进程终止时才会终止。

Solutions:

  • You could copy the source code of subprocess.Popen._communicate and alter it so it does not use wait() but time.sleep and some timeout
  • You write your own code that reads stdout and stderr and stops if the program outputs too much stderr
  • You change the main() function of the file that never ands this 途径
  • def main():
        ## here is you program code
    if __name__ == '__main__':
        import thread, sys, time
        _id = thread.start_new(main, ())
        time.sleep(1)
        t = time.time() + 100 # execute maximum 100 + 1 seconds
        while t > time.time() and _id in sys._current_frames():
            time.sleep(0.001)