Как «поймать» c printf в python с помощью ctypes? - PullRequest
5 голосов
/ 28 июня 2010

Я надеюсь, что это тривиально, и я просто не нашел этого в уроках.Я пишу код на Python, который «контролирует» код на C, иначе я запускаю код на C с помощью PythonТеперь я хочу «поймать» c «printfs» для обработки данных, которые выводятся кодом c.Есть идеи, как можно это сделать?

Спасибо

Ответы [ 2 ]

2 голосов
/ 28 июня 2010

Вы можете перехватить stdout перед записью в ваш код C, а затем обработать выходное значение.

import sys
import StringIO

buffer = StringIO.StringIO()

# redirect stdout to a buffer
sys.stdout = buffer

# call the c code with ctypes
# process the buffer

# recover the old stdout
sys.stdout = sys.__stdout__

Однако было бы проще и приятнее передать буфер в код на языке C, и вместо printf -вхождения выходных значений вы записали бы их в предоставленный буфер.

Или, что еще лучше, вы можете передать byref a c_char_p, выделить для него память внутри кода C, обновить буфер с выходным значением, а затем использовать буфер в Python. Не забудьте освободить память (вы должны сделать оболочку ctypes для функции free).

0 голосов
/ 28 июня 2010

Ну printf просто записывает свой вывод в то, на что указывает указатель файла stdout. Я не уверен, как вы выполняете C-программу, но должна быть возможность перенаправить C-программу stdout на то, что вы можете прочитать на Python.

...