You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:20:30