【问题标题】:subprocess output to stdout and to PIPE子进程输出到标准输出和管道
【发布时间】:2012-03-25 10:28:39
【问题描述】:

我正在使用这样的subprocess 模块:

ping = subprocess.Popen('fping.exe 192.168.2.3 196.65.58.69', stdout=PIPE)
output = ping.stdout.readlines()

我需要output 列表以便稍后在程序中处理它,但似乎因为标准输出被定向到PIPE 它没有将结果输出到控制台。我想同时获得控制台输出(在执行时)和output 列表。

我该怎么做?

我已经搜索过了,得到了答案here,但是我无法实现。

我在 Windows 环境中使用 Python 3.x。

谢谢。

【问题讨论】:

  • 您可以随时在脚本中回显输出:print(output)
  • @LevLevitsky 我想获取控制台输出作为正在执行的命令。
  • 那么os.dup2 呢?

标签: python-3.x subprocess


【解决方案1】:

没有通往两个地方的管道。写入管道的所有内容都只会被读取一次。 (虽然理论上你的程序和控制台可以访问同一个输出管道,但如果你成功了,那么只有一些数据会进入你的程序,只有没有的数据会结束控制台。)要将所有输出都发送到您的程序和控制台,必须有人读取和复制数据。在类 unix 系统上,您可能会为此使用“tee”命令,但您的 Windows 机器上可能没有。

因此,您必须在获得时将输出写入控制台。

在这种情况下,您可能可以在循环中使用 readline() 而不是 readlines()。

【讨论】:

    【解决方案2】:

    我已经找到了一种方法来做到这一点:

    for line in os.popen("Fping x.x.x.x x.x.x.x -l"):
        ipList.append(line)
        print(line)
    

    这样,我可以将 Fping 程序的结果放入列表中,并在它执行时将其打印到屏幕上,因为带有 os.popenfor 循环不会等待程序结束,但总是在程序的每一行循环。

    【讨论】: