Popen子进程.PIPE及其用法

4 投票
2 回答
8846 浏览
提问于 2025-04-18 13:48

我知道这个问题可能被问过很多次,但我还是不太明白。通过阅读这个相关的链接,我明白了为什么在句子的末尾需要加上stdout=subprocess.PIPE,这样输出的结果才能传递给下一个Popen。

我试着在网上查找,但几乎没有找到有用的信息,因为我找到的都是一些文档。

但是如果我不使用输出,真的有必要在末尾加上stdout=subprocess.PIPE吗?我尝试过有和没有这个参数的情况,结果都是我想要的。

那么,subprocess.PIPE在有和没有的情况下,具体有什么大区别呢?

process = subprocess.Popen(command, stdout=subprocess.PIPE)
process.communicate()

2 个回答

3

如果你不打算读写对应的管道,那就不要使用subprocess.PIPE。因为如果操作系统的管道缓冲区满了,可能会导致子进程停滞不前。

如果你想要获取子进程的输出(或者传入输入),可以使用subprocess.PIPE,这样可以把输出作为字符串(变量)获取,或者直接调用subprocess.check_output(),这个函数会为你处理这些事情。

如果你想把process.stdout作为输入传递给另一个进程(就像在命令行中使用a | b的效果),也可以使用subprocess.PIPE

如果你想忽略输出,可以把它重定向到DEVNULL。你也可以把输出重定向到一个文件(或者任何有有效.fileno()的东西,比如Unix上的套接字)。

7

如果不使用 subprocess.PIPE,命令的输出会直接显示在标准输出(STDOUT)上,而 process.communicate() 方法会返回 None。你用的是哪个版本的 Python?

能把输出结果贴出来吗?

撰写回答