Я знаю, что цель Cython состоит в том, чтобы создавать модули расширений Python, но могут ли скомпилированные библиотеки, созданные с помощью Cython, быть загружены не-python-программами? Если нет, то почему?
Я сомневаюсь, что вы можете загрузить их непосредственно на непитоновской программе; Глядя на код C, сгенерированный простейшим скриптом Cython, становится очевидно, что для его работы вам понадобятся все леса Python. Тем не менее, вы можете сделать это косвенно, например, из C ++. В C ++ я использую boost.python в встраивать интерпретатор Python и загрузить некоторые из моих модулей и скриптов. Это может показаться запутанным, но позволяет вам быстро использовать любые расширения, которые вы уже написали на Python из C ++, при условии, что вы создадите соответствующий код склеивания (см. вики Boost.python).
Недостатком этого подхода является то, что вы действительно загружаете полный интерпретатор Python, чтобы иметь возможность использовать какое-то расширение. Это не было проблемой для меня, так как у меня уже было расширение Python, и я встраивал Python в свое приложение для обеспечения базовых возможностей написания сценариев, но я не буду использовать этот подход для написания новых библиотек.
Есть два механизма, с помощью которых вы можете сделать cdef
Внешние структуры Cython:
cdef public
декларация — и / или такжеapi
ключевое слово.Вот один из примеров обоих механизмов из вышеупомянутых страниц:
cdef public struct Vehicle:
int speed
float power
cdef api void activate(Vehicle *v):
if v.speed >= 88 and v.power >= 1.21:
print "Time travel achieved"
Каждый из этих методов будет инструктировать компилятор Cython генерировать файл заголовка («.h»), который вы затем можете интегрировать с вашим ортогональным проектом C / C ++.
cdef public
объявление дает файл с именем modulename.h
; использование структур в этом файле потребует от вас ссылки на скомпилированный модуль расширения Cython.
api
декларация (которая может использоваться одновременно с cdef public
, если вы так желаете) приносить modulename_api.h
файл; код, потребляющий api
заголовок не нужно будет связывать с модулем расширения — но это будут нужно позвонить cdef
Функция d import_modulename()
перед использованием любого кода API (тактика, которой склонны к использованию Cython пользователи NumPy, найти знакомых).
По моему личному опыту, требуется мало усилий для раскрытия и последующего использования энцитонированных структур в качестве внешнего API таким образом, при условии, что структурные макеты хорошо согласуются с потребляющим кодом, и что вы готовы бороться с ручным управлением GIL в Ваш код C / C ++, чтобы заставить вещи работать.