2012-06-13 1 views
4

У меня есть программа C со встроенным кодом python. Я скомпилировал python 2.7.2 из источника и связал свою программу с libpython2.7.a.Могу ли я использовать ctypes для вызова функции C из python, встроенного в C?

Теперь в моем коде на языке python я хочу перезвонить функции из других библиотек C, связанных с моей программой на C. Я могу написать расширение python (см. Расширение Embedded Python в this document). Однако 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.

+0

По какой-то причине это разрушает мой (статический) libffi в _ctypes. – Avner

+0

@Avner: Честно говоря, я на самом деле не попробовал * код выше, поэтому я не могу помочь вам в этом сбое. –

+0

Код выглядит правильно (вот почему я принял ваш ответ). Я подозреваю, что проблема связана с переносом libffi на iOS и с тем, как я скомпилировал libpython.a (со статическими модулями, статическими _ctypes и static libffi). Но поскольку я еще не разрешил этот крах, на данный момент это остается подозрением. – Avner

0

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

+0

А потом сделайте * what * с ним в коде Python? –