Я нашел частичные ответы в документах, списках рассылки и этот вопрос здесь, но я хотел получить более прямой ответ, касающийся моей специфики...
Я изучаю cython, пытаясь постепенно обернуть небольшие части библиотеки, которую я уже использую, которая в настоящее время завернута в boost:: python. Я внес небольшой вклад в эту оболочку boost и использую ее в качестве справочника по С++, в то же время я использую Привязки ZeroMQ Python в качестве ссылки на cython.
Мой вопрос касается структуры проекта. Текущая ускоренная версия этой библиотеки компилируется в один .so
, и это моя цель. Я быстро понял, что вы не можете напрямую скомпилировать несколько модулей .pyx
в один .so
. Затем я начал идти по пути определения cppclass
в файлах pxd
, а соответствующие им классы реализации Python экспортировались в .pxi
и пытался включить их в один pyx
для компиляции. Сначала это работало, но как только я написал немного больше, я столкнулся с проблемами с конфликтующими несколькими определениями из-за включения pxi
в разных местах.
Я хотел бы услышать правильный организационный подход, который решает следующие вопросы и цели:
- Именование общедоступных классов так же, как
cppclass
(я делаю это сейчас, имея класс cpp в другом названииpyd
и используя импортированное пространство имен для обработки похожих имен, аля Использование cimport для разрешения конфликтов имен) - Один
.so
в качестве скомпилированного вывода (приемлемый подход?) - Использую ли я подход
pyx
с несколькими включениями в основнойpyx
только для этого, или этот основнойpyx
должен содержать что-то еще, помимо простого хранения включений? - Где централизованно определить константы, которые будут экспортироваться в python?
- Существует ли предпочтительная структура папок? Прямо сейчас у меня есть все в большом каталоге
src
под моимsetup.py
. Смущает такое количествоpxi, pxd, pyx
файлов. pxi
сейчас совсем не нужны? Если нет, нужно ли мне использовать защиту ifndef в стиле cython для обработки множественных включений между разными модулями?- Я знаю, что привязки Python ZeroMQ создают несколько модулей и используют пакетный подход, включая их через
__init__.py
. Это действительно правильный подход к cython?
Для справки, проект, который я практикую для повторной упаковки, называется PyOpenNI (openni). Шаблон, который использует этот проект повышения, состоит в том, чтобы собрать общие объекты в одном месте, а затем определить определение заголовка 1-к-1 с источником, а затем есть огромная оболочка, которая собирает все определения в одном месте. А также добавлена настраиваемая обработка исключений и утилиты.