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

如何将C++ cout输出存储到Python变量(AWS Lambda场景)

解决C++二进制输出捕获到Python变量的问题

方案1:直接用subprocess调用C++二进制(推荐)

如果可以绕过FDTD.Run方法,直接调用对应的C二进制文件,用subprocess模块能直接捕获输出,无需修改C代码,也不用文件中转:

import subprocess

# 替换为你的C++二进制路径和运行参数
cpp_binary_path = "/path/to/openEMS_cpp_binary"
run_args = ["--config", "your_config.xml"]

# 执行二进制并捕获输出,合并stdout和stderr到同一变量
proc_result = subprocess.run(
    [cpp_binary_path] + run_args,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,
    text=True,
    check=False  # 按需设置:若为True,二进制非0退出码会触发异常
)

# 捕获到的输出存储在proc_result.stdout中
cpp_output = proc_result.stdout
print(cpp_output)

方案2:保留FDTD.Run方法,重定向文件描述符

如果必须使用FDTD.Run,可以通过操作底层文件描述符重定向C++的stdout到临时文件,避免修改Python的sys.stdout导致的文件关闭错误:

import os
import tempfile
from openEMS import FDTD

# 在Lambda可写的/tmp目录创建临时文件
with tempfile.NamedTemporaryFile(mode='w+', delete=False, dir='/tmp') as tmp_file:
    # 保存系统原始stdout的文件描述符
    original_stdout_fd = os.dup(1)
    try:
        # 将stdout重定向到临时文件
        os.dup2(tmp_file.fileno(), 1)
        # 执行FDTD.Run逻辑
        fdtd = FDTD()
        # 此处添加FDTD的参数配置(如网格、激励源等)
        fdtd.Run()
    finally:
        # 强制恢复原始stdout,防止后续代码写入异常
        os.dup2(original_stdout_fd, 1)
        os.close(original_stdout_fd)

# 读取临时文件中的输出内容
with open(tmp_file.name, 'r') as f:
    cpp_output = f.read()

# 清理临时文件
os.unlink(tmp_file.name)

# 使用捕获到的输出
print(cpp_output)

错误原因说明

你遇到的ValueError: I/O operation on closed file,大多是因为直接替换了Python的sys.stdout为已关闭的对象,或是重定向后未恢复原始输出流,导致FDTD.Run内部(或后续代码)尝试写入已关闭的文件流。使用os.dup2操作底层文件描述符,能直接作用于C++二进制的输出目标,比修改Python层面的sys.stdout更可靠。

内容的提问来源于stack exchange,提问作者Coto TheArcher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:22:53