使用Python subprocess获取C++程序输出为空的问题排查
问题原因及修复方案
一、编译环节的致命错误
你编译C++代码的逻辑存在严重错误:
r=open("cpp_input.txt", "r") py_output = subprocess.check_output(['g++', 'try_cpp.cpp'], stdin=r, timeout=problem.timelimit)
g编译程序时,通过命令行参数try_cpp.cpp指定源文件,完全不需要从标准输入读取内容。你将cpp_input.txt作为stdin传入g,会导致g++等待从标准输入获取编译指令,而非编译目标源文件,最终编译大概率失败,生成的a.out要么是旧版本,要么根本不存在,自然无法输出内容。
修复后的编译代码:
# 无需传入stdin,直接编译指定源文件 py_output = subprocess.check_output(['g++', 'try_cpp.cpp'], timeout=problem.timelimit)
二、Python代码中的逻辑错误
1. final变量未追加内容
你的代码每次循环都直接覆盖final的值:
final=str(result)+"\n"
这会导致final最终仅保留最后一次循环的结果,而非两次输出的拼接。需改为追加模式:
final += result.decode('UTF-8') + "\n"
2. 字节串转换错误
p.stdout.readline()返回的是字节串,直接用str(result)会得到b'12'这类带字节标识的字符串,而非预期的'12',需用decode('UTF-8')将字节串转换为普通字符串。
3. 不必要的shell=True
使用shell=True在此场景下无意义,反而可能引入额外的缓冲问题,建议移除,直接调用可执行文件:
p = Popen(['a.out'], stdout=PIPE, stdin=PIPE)
三、修复后的完整Python代码
from subprocess import Popen, PIPE # 移除shell=True,用text=True直接处理文本流(Python3.7+支持) p = Popen(['a.out'], stdout=PIPE, stdin=PIPE, text=True) final = "" for ii in range(2): value = "12\n" p.stdin.write(value) p.stdin.flush() result = p.stdout.readline().strip() final += result + "\n" # 等待子进程执行结束 p.wait() print(final)
内容的提问来源于stack exchange,提问作者I LOVE PYTHON
相关产品推荐
相关产品推荐

