Может ли один из них создать библиотечный API — один доступный вне Python — с использованием Cython?

Я знаю, что цель Cython состоит в том, чтобы создавать модули расширений Python, но могут ли скомпилированные библиотеки, созданные с помощью Cython, быть загружены не-python-программами? Если нет, то почему?

2

Решение

Я сомневаюсь, что вы можете загрузить их непосредственно на непитоновской программе; Глядя на код C, сгенерированный простейшим скриптом Cython, становится очевидно, что для его работы вам понадобятся все леса Python. Тем не менее, вы можете сделать это косвенно, например, из C ++. В C ++ я использую boost.python в встраивать интерпретатор Python и загрузить некоторые из моих модулей и скриптов. Это может показаться запутанным, но позволяет вам быстро использовать любые расширения, которые вы уже написали на Python из C ++, при условии, что вы создадите соответствующий код склеивания (см. вики Boost.python).

Недостатком этого подхода является то, что вы действительно загружаете полный интерпретатор Python, чтобы иметь возможность использовать какое-то расширение. Это не было проблемой для меня, так как у меня уже было расширение Python, и я встраивал Python в свое приложение для обеспечения базовых возможностей написания сценариев, но я не буду использовать этот подход для написания новых библиотек.

1

Другие решения

Есть два механизма, с помощью которых вы можете сделать cdefВнешние структуры Cython:

  1. Использовать cdef public декларация — и / или также
  2. Использовать 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 ++, чтобы заставить вещи работать.

0

По вопросам рекламы [email protected]