【问题标题】:Popen subprocess.PIPE and its usesPopen subprocess.PIPE 及其用途
【发布时间】:2014-09-09 05:26:04
【问题描述】:

我知道这个问题可能已经被问了很多,但我仍然没有真正理解它。 看了这个相关的link,我可以理解为什么需要在句尾加上stdout=subprocess.PIPE,这样输出的结果就可以用于下一个Popen。

尝试在网上查找,但我对它几乎一无所知,因为我发现的是文档形式。

但是如果我不使用输出,真的有必要把stdout=subprocess.PIPE放在最后吗? 我尝试在使用和不使用它的情况下执行它,它仍然给了我想要的预期结果。

因此,subprocess.PIPE 是否存在的最大区别是什么?

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

【问题讨论】:

    标签: python subprocess popen


    【解决方案1】:

    如果没有 subprocess.PIPE,命令的输出将打印在 STDOUT 上,并且 process.communicate() 应该返回 None。 你用的是哪个python版本?

    你能粘贴输出吗?

    【讨论】:

    • 我使用的是 Python 2.7
    • 如果我错了,请纠正我,即使我尝试了这个简单的例子process = subprocess.Popen(['echo', 'Hello World!'], stdout=subprocess.PIPE),正如你所提到的,区别在于None 打印出来。但是我仍然得到Hello World! 打印的结果,这不被视为输出吗?
    • 如果没有 subprocess.PIPE,您将无法在变量中获取命令返回的输出。这就是区别。有点像 print "Hello World" vs return "Hello World"
    • 好的,谢谢...我还是有点“不相信”?或者更确切地说,无法看到它是如何工作的逻辑......将尝试在“Hello World”与返回“Hello World”示例中看到它
    • 让我再试一次:假设在您的 python 脚本中,您必须将“ps aux”(shell 命令)的输出写入文件。文件写入部分必须在 python 中而不是在 shell 中,所以你需要一个变量中的“ps aux”结果,你可以使用它来执行 file.write(var)。为此,您必须设置 STDOUT --> subprocess.PIPE
    【解决方案2】:

    如果您不读取/写入相应的管道,那么您应该使用subprocess.PIPE。如果相应的操作系统管道缓冲区填满,它可能会停止子进程。

    如果您想将get the output of the child process(或传递输入)作为字符串(变量)使用subprocess.PIPE,或者只是调用subprocess.check_output(),它会在内部为您完成。

    如果您想将process.stdout 作为标准输入传递给另一个进程(到emulate a | b shell command),请使用subprocess.PIPE

    如果你想忽略输出;你可以redirect it to DEVNULL。您可以将其重定向到文件(或任何具有有效 .fileno() 的内容,例如 sockets on Unix)。

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 2012-08-17
      • 1970-01-01
      • 2017-09-18
      • 2014-10-17
      • 1970-01-01
      • 2013-07-06
      • 2015-06-20
      • 2013-08-12
      相关资源
      最近更新 更多