如何将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
相关产品推荐
相关产品推荐

