2010-07-29 25 views
1

我有这个程序,当这样在控制台上执行:子过程无法捕获STDOUT - 程序可能会做什么?

prog 1> output 2> error 

有有效的输出和错误。但是,当我使用子进程模块执行相同的程序时。

p = subprocess.Popen(['prog'],stdout=PIPE, stderr=PIPE,close_fds=True) 
out, err = p.communicate() 

out是空的,但err是正确的。这里会发生什么? 我可以做一个os.system并指导输出和错误。但直到最近我一直依靠子过程。

可能是什么问题?这仅在Linux上尝试过。不在Windows上。 `

回答

1

您是否在Windows上试用?

使用close_fds是 平台依赖,根据subprocess.Popen() doc

如果close_fds为真,除了0,1和2之外的所有文件描述符将在执行子进程之前关闭。 (仅适用于Unix)。或者,在Windows上,如果close_fds为true,那么子进程将不会继承任何句柄。 请注意,在Windows上,您无法将close_fds设置为true,并通过设置stdin,stdout或stderr来重定向标准句柄。

+0

不,我没有尝试在Windows上。我在Linux上尝试这个。 感谢您的回复。 – 2010-07-29 05:24:08

+0

信息的每一点帮助... – gimel 2010-07-29 05:32:43

0

只是想你的代码和我的作品:

>>> p = subprocess.Popen(['ls'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
close_fds=True) 
>>> out, err = p.communicate() 
>>> out 
'build\nCode\n...' 
>>> err 
'' 

一)确保程序正确调用。

b)您是否正确导入PIPE?

+0

是的,程序被正确调用,PIPE也正确导入。 这不是问题在这些目的。不管怎么说,多谢拉。 – 2010-07-30 01:09:21

相关问题