gpt4 book ai didi

python - 为什么从Python 3子进程读取实时输出需要按回车键才能输出数据?

转载 作者:太空宇宙 更新时间:2023-11-03 21:33:19 26 4
gpt4 key购买 nike

我一直在阅读有关 Python 3 中子进程实时处理的可用问题,尽管它们都没有解决我遇到的确切问题。我正在编写一个脚本来解析相关数据并格式化专门针对臭名昭著日的源服务器的输出。

当脚本启动时,它会启动 Day of Infamy 服务器 (./doi.sh),该服务器提供服务器启动变量,例如 map 、播放列表、战眼服务器数据等。在某个时刻,服务器脚本只是挂起,等待诸如连接或杀死之类的事件发生。此时,服务器会将其记录到 STDOUT,但是除非您按“输入”键,否则我的 Python 程序将停止输出任何数据。按“输入”后,将打印最新的事件数据。

什么可能导致需要按 Enter 以获得更多输出? doi.sh 服务器脚本等待事件时是否会超时?

我当前运行和读取子进程的代码是:


cmd = './doi.sh'
数据 = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, bufsize=1)



当 True 时:
输出 = data.stdout.readline()
如果 output == '' 并且 data.poll() 不是 None:
休息
如果输出:
输出 = 输出.解码('utf-8')
打印(输出)

我构建了一些函数来解析解码字符串中的信息,这些函数在子进程输出的行上工作,但必须按 Enter 来更新控制台日志违背了整个程序的目的。

最佳答案

这几乎肯定是标准输出缓冲的问题。尝试像这样替换命令:

stdbuf -o0 ./doi.sh

这将强制 doi.sh 的标准输出不被缓冲。您还需要在 subprocess.Popen()

中设置关键字 arg shell=True

这里有一个很好的解释:https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

关于python - 为什么从Python 3子进程读取实时输出需要按回车键才能输出数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53397031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com