Перенаправление stdout из класса C ++ в оболочке SWIG на нефайловый объект python - PullRequest
2 голосов
/ 25 марта 2011

Я пытаюсь перенаправить вывод из модуля 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

1 Ответ

0 голосов
/ 01 апреля 2011

Я могу предложить вам только подход.
1. Используйте os.pipe () для создания пары fd 2. передать канал "write" в ваш C 3. переопределить "stdout" этой трубкой (в C-land) 4. Теперь вывод «C» появится в «read» стороне этого os.pipe () 5. Вернитесь в Python-Land, прочитайте из канала и запишите в стандартный вывод Python.

... Вероятно, есть более простой подход ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...