【问题标题】:Python Subprocess Module PIPE LinesPython 子流程模块管道线
【发布时间】:2015-02-02 20:00:08
【问题描述】:

你们对 Python Subprocess Module 下的 PIPE Lines 了解多少?

这是一个例子:

代码 1:

from subprocess import *
output = Popen("ls")

代码 2

from subprocess import *
output = Popen("ls", stdin=PIPE, stdout=PIPE)

这两个代码有什么不同?

提前致谢

【问题讨论】:

  • 很多东西。您有什么特别的问题吗?
  • 拜托,再次检查问题,我做了一些修改
  • 查看python.org 的文档。它很好地解释了 Popen() 构造函数的可能参数...或者,您可以在交互式 Python 会话中输入 help(subprocess.Popen)... 不是很冗长,但通常也很好...
  • 我确实知道如何很好地使用子进程,我需要知道的是概念,当我们想通过套接字发送标准输出时,我们通常使用 PIPE 和子进程,而没有 PIPE 则标准输出不能发送

标签: python pipe subprocess


【解决方案1】:

在您的第一个代码中,output 将是一个对象,其中包含当前目录上的ls 命令的结果。

在您的第二个代码中,您正在管道ls 命令的stdout,在这里您使用了stdin,只提到了PIPE,这是错误的,因为您没有提及您从中获取的任何对象stdin.

您的第二个代码在这种形式下可能会更好:

from subprocess import *
output = Popen(["ls"], stdout=PIPE).communicate()[0]

在这里,我使用subprocesscommunicate 方法将stdout(和stderr)通过管道发送到stdin。它返回一个(stdout, stderr) 的元组,但我们只对stdout(索引0)感兴趣,所以我使用了communicate()[0]

【讨论】:

  • 不正确。在这两种情况下,不正确命名的 "output"Popen 对象。它不包含ls 命令的结果(输出)。在第一种情况下,ls' 输出将转到父级 (python) 标准输出点的任何位置(例如,到终端)。在第二种情况下,ls 输出的(部分)缓冲在output.stdout 对象中。
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 2013-03-28
  • 1970-01-01
  • 2014-09-13
相关资源
最近更新 更多