Могу ли я использовать ctypes для вызова функции C из Python, встроенного в C?

У меня есть программа на C со встроенным кодом Python. Я скомпилировал Python 2.7.2 из исходного кода и связал свою программу с libpython2.7.a.

Теперь в моем коде Python я хочу отозвать функции из других библиотек C, связанных с моей программой C. Я могу написать расширение Python (см. Расширение встроенного Python в этом документе). Тем не менее, ctypes сделает это намного проще и позволит мне использовать некоторый существующий код без изменений.

ctypes предназначен для загрузки разделяемых библиотек, и мне было интересно, есть ли способ "указать" его на мой статический программный код.

Я не могу скомпилировать соответствующий код в общую библиотеку, потому что моя цель - iOS, и общие библиотеки AFAIK запрещены Apple.

2 ответа

Решение

Из кода Python вы можете создавать обертки ctypes для статических функций, например:

restype = ctypes.c_int
argtypes = [ctypes.c_int, ctypes.c_double]        # or whatever
functype = ctypes.CFUNCTYPE(restype, *argtypes)
wrapper = functype(address_of_static_function_as_an_int)

Вы можете, конечно, назвать этот (или аналогичный) код из своего кода C.

Создайте значение ctypes (например, ctypes.c_void_p) инкапсулировать указатель на функцию и передать его в код Python.

Другие вопросы по тегам