我正在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。