Я использую модуль SWIG в скрипте Python, и я хотел бы перенаправить / отключить лишний вывод, напечатанный модулем на экране. Я знаю о возможности перенаправить stdout / stderr в скрипте Python, например. используя redirect_stdout
из contextlib
. Проблема, однако, в том, что программа C ++, обернутая SWIG, определяет свой собственный поток ввода-вывода, который, очевидно, не перехватывается определениями stdout в моем скрипте Python.
Модуль является частью библиотеки: 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
Это используется, например, функцией wp_DM, определенной в Cosmology / Lib / Cosmology. CPP например. строка 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)
Я ожидаю, что не будет никакого вывода, но вместо этого есть все распечатки. Я также попытался перенаправить stderr на devnull с результатами sam. Изменение базовой программы на C ++ было бы затруднено, поэтому делать это на уровне Python было бы весьма предпочтительно. Я использую Linux.