Я пытаюсь перенаправить вывод из модуля 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, которая выводит на стандартный вывод при вызове функции C SWIG-обертки, которая сама печатает в заданный файл. ручка.
Спасибо,
Herve