子进程无法捕获STDOUT - 程序可能在做什么?
我有一个程序,当我在控制台上这样执行时:
prog 1> output 2> error
它能正常输出结果和错误信息。但是,当我使用子进程模块执行同样的程序时:
p = subprocess.Popen(['prog'],stdout=PIPE, stderr=PIPE,close_fds=True)
out, err = p.communicate()
输出是空的,但错误信息却是正常的。这可能是什么原因呢?我可以使用 os.system 来直接获取输出和错误信息,但我最近一直依赖子进程模块来处理这些。
这可能是什么问题呢?我是在 Linux 系统上尝试的,不是在 Windows 上。
2 个回答
0
我刚试了你的代码,运行得很好:
>>> p = subprocess.Popen(['ls'], stdout=subprocess.PIPE, stderr=subprocess.PIPE,
close_fds=True)
>>> out, err = p.communicate()
>>> out
'build\nCode\n...'
>>> err
''
a) 确保你的程序调用方式是对的。
b) 你有没有正确导入PIPE这个东西?
1
你是在Windows上尝试这个吗?
使用 close_fds
这个选项是和操作系统有关的,具体情况可以参考 subprocess.Popen()
的文档。
如果
close_fds
设置为真,那么在执行子进程之前,除了0、1和2这三个文件描述符,其他的都会被关闭。(这只适用于Unix系统)。而在Windows上,如果close_fds
设置为真,那么子进程不会继承任何句柄。注意,在Windows上,你不能同时把close_fds
设置为真,并且通过设置标准输入、输出或错误输出(stdin、stdout或stderr)来重定向标准句柄。