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