Python - 捕获 Popen 标准输出并显示在控制台上?

标签 python pipe popen

我想从通过 subprocess.Popen(...) 启动的长时间运行的进程中捕获 stdout,所以我使用 stdout=PIPE 作为参数.

但是,因为这是一个长时间运行的过程,所以我还想将输出发送到控制台(就好像我没有通过管道传输一样),让脚本的用户知道它仍在运行。

这有可能吗?

干杯。

最佳答案

您长时间运行的子进程正在执行的缓冲可能会使您的控制台输出不稳定并且非常糟糕的用户体验。我建议您考虑使用 pexpect (或者,在 Windows 上,wexpect)打败这种缓冲并从子进程中获得平滑、规则的输出。例如(在几乎任何 unix-y 系统上,安装 pexpect 之后):

>>> import pexpect
>>> child = pexpect.spawn('/bin/bash -c "echo ba; sleep 1; echo bu"', logfile=sys.stdout); x=child.expect(pexpect.EOF); child.close()
ba
bu
>>> child.before
'ba\r\nbu\r\n'

ba 和 bu 会在适当的时间出现(它们之间大约一秒)。请注意,输出不受正常终端处理的影响,因此回车保留在那里——如果您需要,您需要自己对字符串进行后处理(只是一个简单的 .replace!-)需要 \n 作为行尾标记(缺少处理很重要,以防子进程将二进制数据写入其标准输出——这确保所有数据完好无损!-) .

关于Python - 捕获 Popen 标准输出并显示在控制台上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1283061/

相关文章:

python - Python if/elif语法错误…为什么

python - 是否可以将 Pygame 作为 cronjob 运行?

linux - cut、colrm、awk 和 sed : fail to cut characters from a pipe stream 的奇怪问题

c - 父级从管道中读取 - 什么情况

python - subprocess.Popen 使用相对路径

c - 为什么 posix_spawn() 在 popen() 工作的地方失败?

python - 是否可以用 str.contain 定义句子中字符的索引?

python - Python 文件无法编译时如何使用 Sphinx 自动文档

linux - 在Linux中使用父进程和子进程使用管道

python - python Popen中的大括号