重定向SWIG模块的输出

时间:2019-10-14 14:33:06

标签: python swig

我正在Python脚本中使用SWIG模块,我想重定向/静音该模块在屏幕上打印的多余输出。我知道在Python脚本中重定向stdout / stderr的可能性,例如。使用redirect_stdout中的contextlib。但是问题是,由SWIG包装的C ++程序定义了自己的IO流,这显然没有被我的Python脚本中的stdout定义捕获。

该模块是库的一部分:https://github.com/federicomarulli/CosmoBolognaLib

我认为相关的流定义在文件Headers / Kernel.h中,从675行开始:

inline std::ostream &headerCBL (std::ostream &stream)
{
stream << par::col_blue << "CBL > " << par::col_default;
   return stream;
}

#define coutCBL std::cout << headerCBL

例如由Cosmology / Lib / Cosmology.cpp中定义的功能wp_DM使用。 949行:

coutCBL <<"I'm writing the file: "<<file_table<<endl;

这是我的测试Python脚本:

import CosmoBolognaLib as cbl
from contextlib import redirect_stdout, redirect_stderr
import os, sys

cosmo = cbl.Cosmology(cbl.CosmologicalModel__Planck15_)
cosmo.set_sigma8(0.8)
with open(os.devnull, 'w') as out, redirect_stdout(out):
    cosmo.wp_DM(1., 'EisensteinHu', 0., 50., False)

我希望没有输出,但是所有打印输出都在那里。我还尝试过将sderr的stderr重定向到devnull。修改底层的C ++程序将很困难,因此在Python级别进行此操作非常可取。我正在使用Linux。

0 个答案:

没有答案