Перенаправление вывода из модуля SWIG - PullRequest
0 голосов
/ 14 октября 2019

Я использую модуль 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.

...