проблема перенаправления stdout функций C при импорте в python - PullRequest
4 голосов
/ 11 июля 2011

Я написал простой модуль C, который печатает на стандартный вывод с помощью printf.

// sample.c
func_print()
{
    printf("Hello World!\n");
}

Позже я сделал обертку вокруг этого, используя SWIG, чтобы я мог использовать func_print и в моей программе на python. В этой программе я перенаправил стандартный вывод в виджет textctrl. Все, что я печатаю с использованием print, печатается правильно в виджете textctrl, как и ожидалось.

# sample.py
...
sys.stdout = textctrl          # textctrl is a TextCtrl widget (wxPython).
print 'Hello from Python!'     # prints in the textctrl widget, as expected.

Однако, когда я вызываю функцию C func_print() (из sample.py), она выводит на терминал вместо виджета textctrl.

func_print()                   # [Problem] prints to the terminal window, instead of the textctrl widget.  

Почему-то кажется, что stdout для функций в модуле C не перенаправляются должным образом. Пожалуйста, помогите мне исправить это. Спасибо.

1 Ответ

5 голосов
/ 13 июля 2011

Ваша проблема в том, что sys.stdout - это объект Python, а не фактический поток C или дескриптор файла. Из документации sys.stdout :

(Изменение этих объектов не влияет на стандартные потоки ввода / вывода процессы, выполняемые os.popen (), os.system () или семейством exec * () функции в модуле os.)

Ваш код на C мало чем отличается от процесса, порожденного os.system, в том, что он имеет доступ только к традиционным дескрипторам файлов Unix для вывода, а не к объектам Python. (Ну, во всяком случае, без лишней работы.)

Если вы просто хотите перенаправить стандартный вывод на системном уровне в другой файл или сокет, см. os.dup2 .

Но если вы действительно хотите отправить вывод в объект Python из C, см. Вызов функций Python из C .

...