Я пытаюсь перенаправить вывод из модуля C, обернутого в SWIG, в класс python. Вызывающий SWIG — это класс python, в котором уже перезаписан sys.stdout следующим образом:
with _redirect_streams():
my_C_function(sys.stdout)
try:
out_s = sys.stdout.getvalue()
except AttributeError:
out_s = ""
try:
err_s = sys.stderr.getvalue()
except AttributeError:
err_s = ""
class _redirect_streams(object):
def __enter__(self):
self._orig_stdout = sys.stdout
self._orig_stderr = sys.stderr
sys.stdout = StringIO()
sys.stderr = StringIO()
def __exit__(self, exc_type, exc_val, exc_tb):
sys.stdout = self._orig_stdout
sys.stderr = self._orig_stderr
В SWIG я могу перенаправить все printf на дескриптор файла FILE* fh
, который я передаю из python.
Он отлично работает, если я вызываю свою функцию C, передавая sys.__stdout__
(реальный объект файла), но если я передаю sys.stdout
после того, как он был перезаписан, это больше не объект файла python (StringIO), и файл C не может печатать на это.
Каков наилучший подход в такой ситуации?
Есть ли способ захватить стандартный вывод в python, все еще передавая дескриптор типа файла функции C?
Редактировать: На самом деле я немного упростил, в моем коде my_C_function
по-прежнему является функцией Python, которая выводит на стандартный вывод при вызове функции SWIG-обертки C, которая сама печатает в заданный дескриптор файла.
Спасибо, Эрве.