在某些机器,对于下面的代码段Python子流程包不会报告子流程中的错误?
p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT);
out, err = p.communicate()
这个脚本会只是挂在p.communicate()
,并没有返回。
手动运行命令后,我终于看到了错误信息。
这是为什么,我该如何解决?
谢谢。
在某些机器,对于下面的代码段Python子流程包不会报告子流程中的错误?
p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT);
out, err = p.communicate()
这个脚本会只是挂在p.communicate()
,并没有返回。
手动运行命令后,我终于看到了错误信息。
这是为什么,我该如何解决?
谢谢。
我猜你的程序永远不会结束?
当你调用沟通()它在不同的操作系统下做不同的事情。但它总是等待启动的流程自行退出,例如。调用p.wait()。 p.wait()仅在rocess结束时终止。
解决方案:
方式
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__
找到它。
尝试stderr = subprocess.PIPE
不stderr = subprocess.STDOUT
什么是错误信息?如果你尝试一个不同的命令,你有同样的问题吗?什么是'cmd'? – mgilson 2012-07-19 18:53:15
你的过程似乎不会终止,而communicat()方法只是等待它发生,因为它是有记录的。而不是错误代码是未定义的,直到子进程终止(将此代码返回到操作系统并最终返回到父进程) – spacediver 2012-07-19 19:25:44
因此请定义到底什么是您想要实现的所需交互方案。你是否需要为输入数据和捕获输出提供进程?例如,如果你只需要等待终止并捕获错误代码,那么'subprocess.call()'就足够了。 – spacediver 2012-07-19 19:28:56