【问题标题】:Python - read output from long-running subprocess [duplicate]Python - 从长时间运行的子进程中读取输出
【发布时间】:2016-08-20 22:51:01
【问题描述】:

使用 subprocess 模块 (Python 2.7),我正在运行一个命令并尝试在其运行时处理其输出。

我有如下代码:

process = subprocess.Popen(
    ['udevadm', 'monitor', '--subsystem=usb', '--property'],
    stdout=subprocess.PIPE)
for line in iter(process.stdout.readline, ''):
    print(line)

但是,即使我在 print 语句后添加 sys.stdout.flush(),输出也只会在我 Ctrl+C 后打印。

为什么会发生这种情况,如何实时流式传输此过程的输出?

值得注意的是,这个udevadm monitor 命令并不打算终止,所以我不能简单地等待进程终止并立即处理其输出。

我找到了live output from subprocess command,但接受的答案中的方法并没有解决我的问题。

【问题讨论】:

标签: python subprocess


【解决方案1】:

你可以使用unbuffer

process = subprocess.Popen(
    ["unbuffer", 'udevadm', 'monitor', '--subsystem=usb', '--property'],
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(process.stdout.readline, ''):
    print(line)

【讨论】:

  • 谢谢!这行得通。但是有没有办法只用 Python 来做到这一点?我宁愿避免 expect 依赖。
  • 不幸的是,我看不到方法,但这当然并不意味着没有,如果我断开连接并将某些东西重新连接到使用端口,我确实会看到一些输出,但在多于行缓冲的块中,仍然是输出之间的延迟
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 2013-01-25
  • 2014-02-10
  • 2011-11-20
  • 2019-02-21
相关资源
最近更新 更多