python - 是否可以将 subprocess.Popen 的标准输出重新连接到 sys.stdout? ( python 3)

标签 python python-3.x subprocess

我有一个 python 程序,它使用 popen 运行另一个程序。是否可以从程序的输出中读取一段时间,并将子程序的输出连接到 sys.stdout,并允许它并行运行,就像我在没有 stdout 的情况下启动它一样=subprocess.PIPE 选项?

包装器:

#! /usr/bin/env python3

import subprocess
from time import sleep
import sys

p = subprocess.Popen(
  ["./count.py"],
  stdout=subprocess.PIPE,
)

for line in iter(p.stdout.readline,''):
  l = line.decode('utf-8')
  sys.stdout.write(">>" + l)
  if "8" in l:
    # somehow reconnect p.stdout to sys.stdout
    break

sleep(1)

print("now do some stuff in parallel")

sleep(1)

p.terminate()

测试程序:

#! /usr/bin/env python

from time import sleep
import sys

for x in range(1,100):
  sleep(.1)
  print x
  sys.stdout.flush()

输出:

$ ./wrapper.py
>>1
>>2
>>3
>>4
>>5
>>6
>>7
>>8
now do some stuff in parallel

这有可能吗?

$ ./wrapper.py
>>1
>>2
...
>>7
>>8
9
10
...
18
19
now do some stuff in parallel
20
21
...
28
29

最佳答案

您不能“重新连接”您已经启动的子进程的文件描述符(除非使用非常肮脏和特定于操作系统的技巧)。您唯一可以控制的文件描述符是仍在您的进程中的文件描述符,它仅对读取有用。因此,如果您希望将内容输出到 stdout,那么进入读取端的所有内容都必须以某种方式复制到 stdout。

幸运的是,您始终可以生成另一个子进程来执行此操作。这正是方便的 Unix 实用程序 cat 擅长的事情。

subprocess.Popen(
  ["/bin/cat"],
  stdin=p.stdout,
)

这基本上会创建一个管道,您可以在其中将一个进程的输出通过管道传输到另一个进程。它可能非常有用。在这种情况下,另一个进程 (cat) 只是输出到标准输出。

关于python - 是否可以将 subprocess.Popen 的标准输出重新连接到 sys.stdout? ( python 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49125081/

相关文章:

Python mysql 包未运行 REPLACE 语句

python - 从 HTML 页面获取带有特定关键字的 <li> - Python

python - 将一个 pandas DataFrame 的副本合并到另一个 DataFrame 的每一行中?

python - 如何在 Django 模型中创建指向另一个模型的链接?

python - 运行 Python 子进程

Python 无法通过 TravisCI 上存在且位于 PATH 中的子进程启动命令

python - 有没有一种方法可以在 Python 中检索子目录而不必遍历所有文件?

python - 为什么cv2.line()不能取float值?

python-3.x - 使用 tf.reshape() 时出现无效参数错误

python - 我是否需要研究子进程才能使此 python 源代码在另一种编程语言中工作?