2012-07-19 60 views
1

在某些机器,对于下面的代码段Python子流程包不会报告子流程中的错误?

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

这个脚本会只是挂在p.communicate(),并没有返回。

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

这是为什么,我该如何解决?

谢谢。

+1

什么是错误信息?如果你尝试一个不同的命令,你有同样的问题吗?什么是'cmd'? – mgilson 2012-07-19 18:53:15

+0

你的过程似乎不会终止,而communicat()方法只是等待它发生,因为它是有记录的。而不是错误代码是未定义的,直到子进程终止(将此代码返回到操作系统并最终返回到父进程) – spacediver 2012-07-19 19:25:44

+0

因此请定义到底什么是您想要实现的所需交互方案。你是否需要为输入数据和捕获输出提供进程?例如,如果你只需要等待终止并捕获错误代码,那么'subprocess.call()'就足够了。 – spacediver 2012-07-19 19:28:56

回答

0

我猜你的程序永远不会结束?

当你调用沟通()它在不同的操作系统下做不同的事情。但它总是等待启动的流程自行退出,例如。调用p.wait()。 p.wait()仅在rocess结束时终止。

解决方案:

  • 您可以复制subprocess.Popen._communicate的源代码,并改变它,所以它不使用的wait(),但time.sleep和一些超时
  • 你编写自己的代码读取输出和错误,如果程序输出
  • 您更改文件的main()函数,从来没有ANDS这样太标准错误停止

方式

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) 

如果你想看看子的来源,你可以在subprocess.__file__找到它。

0

尝试stderr = subprocess.PIPEstderr = subprocess.STDOUT