【问题标题】:read from subprocess output python从子进程输出python读取
【发布时间】:2018-08-02 18:27:50
【问题描述】:

我正在使用“Popen”运行一个子进程。我需要阻塞直到这个子进程完成,然后读取它的输出。

p = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE, encoding="utf-8")
p.communicate():
output = p.stdout.readline()
print(output)

我收到一个错误

ValueError: I/O operation on closed file.

如何在子进程完成后读取输出,但我不想使用 poll(),因为子进程需要时间,而且无论如何我都需要等待它的完成。

【问题讨论】:

  • p.communicate() 返回输出。
  • 您不使用subprocess.run() 或旧版subprocess.check_output() 的任何特殊原因?如果可以的话,你应该避免使用Popen,因为它很难做到正确。
  • @jasonharper, p.communicate() 返回bound method Popen.communicate of <subprocess.Popen object at 0x105e84e10,而不是子进程代码的输出
  • output, error = p.communicate() 应该可以工作,该输出看起来就像您正在打印 p.communicate(不带括号)。

标签: python popen


【解决方案1】:

这应该可行:

p = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE, encoding="utf-8")
output, error = p.communicate()

print(output)
if error:
    print('error:', error, file=sys.stderr)

不过,subprocess.run() 现在是首选:

p = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

print("output:", p.stdout)

if proc.stderr:
    print("error:", p.stderr, file=sys.stderr)

【讨论】:

    【解决方案2】:

    使用subprocess.check_output。它返回命令的输出。

    【讨论】:

      猜你喜欢
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2019-02-21
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多