首页 > 解决方案 > 在 python 中从 c/c++ 获取和存储 stdout printf() 函数

问题描述

我有一个带有一些 printf() 函数的 OpenCL 程序,这个程序在 pyOpenCL 上运行。我想将标准输出存储在一个变量中。我尝试实现此目的的实际代码是:

from io import StringIO # Python3 use: from io import StringIO
import sys
old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()
# fpga_conv = conv2d.Matmul(H, fpga_mtx, s_mask_ref.astype(np.int32), 1, 0)
# Call to the OpenCL program via pyOpenCL
fpga_ref = conv2d.Matmul(H_ans, fpga_mtx, s_mask_ans.astype(np.int32), 1, 1, (H_h, H_w))
sys.stdout = old_stdout
string = mystdout.getvalue() # Store stdout in a var

但只捕获 python print()标准输出。有可能得到所有的标准输出吗?我发现的唯一方法是使用python module.py &> "ref.txt"将 printf() 标准输出存储在 ref.txt 文件中的指令在 bash 中运行脚本。我需要通过 IDE(在本例中为 Spyder)运行程序,而不是在 bash 终端中。有什么建议或技巧吗?谢谢!

标签: pythonc++printfstdout

解决方案


最后我通过wurlitzer模块找到了解决方案 - > https://github.com/minrk/wurlitzer

完美运行,只需要 2 或 3 行代码。我的问题的示例是(使用 StringIO):

out = StringIO()
with pipes(stdout=out, stderr=STDOUT):
    w_fpga_ref = conv2d.Matmul(w_H_ans, fpga_mtx, w_s_mask_ans.astype(np.int32), 1, 1, (w_H_h, w_H_w))
x = out.getvalue()

推荐阅读