Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python子流程包不报告来自子流程的错误?_Python_Linux_Subprocess - Fatal编程技术网

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

Python子流程包不报告来自子流程的错误?,python,linux,subprocess,Python,Linux,Subprocess,在某些机器上,对于以下代码 p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT); out, err = p.communicate() 此脚本将挂起在p.communicate(),不会返回 在手动运行命令之后,我终于看到了错误消息 为什么会这样,我应该如何解决 谢谢 试试stderr=subprocess.PIPE而不是stderr=subprocess.STDOUT我想你的程序永远不

在某些机器上,对于以下代码

p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT);
out, err = p.communicate()
此脚本将挂起在
p.communicate()
,不会返回

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

为什么会这样,我应该如何解决


谢谢

试试
stderr=subprocess.PIPE
而不是
stderr=subprocess.STDOUT
我想你的程序永远不会结束吧

调用communicate()时,它在不同的操作系统下执行不同的操作。但它总是等待启动的进程自行退出,例如调用p.wait()。 p、 wait()仅在进程终止时终止

解决方案:

  • 您可以复制subprocess.Popen的源代码。\u通信并修改它,使其不使用wait(),而是使用time.sleep和一些超时
  • 您可以编写自己的代码来读取stdout和stderr,如果程序输出的stderr太多,则会停止
  • 您可以更改文件的main()函数,该函数永远不会以这种方式执行
方式


如果您想查看子流程的源代码,您可以在
子流程中找到它。\u\u file\u

错误消息是什么?如果您尝试不同的命令,是否存在相同的问题?什么是
cmd
?您的进程似乎没有终止,而communicate()方法只是等待它发生,正如文档所记录的那样。并不是说在子进程终止之前错误代码是未定义的(将此代码返回到操作系统并最终返回到父进程),所以请准确定义您试图实现的所需交互方案。您是否需要为流程提供输入数据并捕获输出?。。。例如,如果您只需要等待终止并捕获错误代码,
子进程.call()
就足够了。@mgilson这是我自己编写的脚本,报告一些基本的numpy错误,如形状不对齐。@spacediver但为什么它不终止?它已抛出未处理的异常。我不需要给它输入,但我需要处理它的输出。
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)