Windows下C++通过boost::process调用Python无法实时获取输出如何解决?
问题根因
这一问题并不是boost::process导致的,是Python的默认输出缓冲规则引起的:当Python检测到标准输出被重定向到管道而非交互式终端时,会默认启用块缓冲,所有print输出会先暂存到内存缓冲区,直到缓冲区满或进程退出时才会一次性全部输出,因此你会在C++端看到所有输出延迟到Python进程结束后才返回。
解决方案
你可以从两个方向修改,都能实现实时输出:
方案1:修改C++代码,给Python解释器加无缓冲启动参数(无需修改Python脚本,更推荐)
Python提供了-u命令行参数,用于强制标准输入/输出/错误流使用无缓冲模式,你只需要修改C++中创建子进程的代码即可:
// 原来的写法 // bp::child c("python.exe", "script.py", bp::std_out > stream); // 修改为添加-u参数 bp::child c("python.exe", "-u", "script.py", bp::std_out > stream);
修改后重新编译运行C++程序,就能实时收到Python的逐行输出。
方案2:修改Python脚本,手动控制输出刷新
如果你不方便修改C++侧的启动参数,也可以在Python脚本中调整输出逻辑:
- 方式A:给每个print调用加上
flush=True参数
print( "Started Python script at t=" + str(datetime.now().time()), flush=True ) time.sleep(1) print( "Slept 1 sec, t=" + str(datetime.now().time()), flush=True ) # 其余print都做相同修改
- 方式B:全局开启行缓冲(仅Python3.7及以上版本支持)
在Python脚本开头加入以下代码:
import sys sys.stdout.reconfigure(line_buffering=True)
之后所有print输出都会在换行时自动刷新缓冲区。
修改完成后运行即可得到你期望的实时输出效果,第一次getline只会阻塞到Python输出第一行为止,后续每行都会在Python打印后立刻被C++侧读取。
内容的提问来源于stack exchange,提问作者jpo38
相关产品推荐
相关产品推荐

