我想从通过 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/