Подтвердить что ты не робот

Как скомпилировать и связать несколько модулей (или пакетов) python с помощью cython?

У меня есть несколько модулей python (организованных в пакеты), которые зависят друг от друга. например.

  • Module1
  • Module2: импорт Module1
  • Module3
  • Module4: импортирует модуль 3, модуль 2, модуль 1

Предположим, что соответствующий интерфейс для разработки приложений находится в модуле 4, и я хочу сгенерировать модуль 4.so, используя cython. Если я начну наивно, я получаю расширение Module4.so, которое я могу импортировать НО, расширение полагается на исходный код python Module1, Module2, Module3.

Есть ли способ скомпилировать, чтобы модули Module1, Module2, Module3 были скомпилированы и связаны с Module4? Я бы хотел, чтобы избегал делать все вручную, например. сначала скомпилируйте Module1.so, затем измените объявление импорта в Module2, чтобы импортировать Module1.so, а не Module1.py, затем скомпилируйте Module2 в Module2.so и т.д....

Спасибо!

4b9b3361

Ответ 1

Изменить. Первые два варианта относятся к конкретному коду Cython, то, что я пропустил, заключается в том, что речь идет о чистых модулях python, поэтому вариант 3 является решением.

Есть несколько вариантов:

1. См. "Как создать иерархию модулей в пакете": https://github.com/cython/cython/wiki/PackageHierarchy

2. Я предпочитаю выражение "включить": http://docs.cython.org/src/userguide/language_basics.html#the-include-statement У меня много файлов .pyx, и все они включены в main.pyx, все это в одном пространстве имен. Результатом является один большой модуль: http://code.google.com/p/cefpython/source/browse/cefpython.pyx

3. Вы можете скомпилировать все свои модули сразу, используя настройку, добавив несколько "Расширений":

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("example", sourcefiles), Extension("example2", sourcefiles2), Extension("example3", sourcefiles3)]
)

4. Более эффективная компиляция - см. здесь.

setup (
    name = 'MyProject',
    ext_modules = cythonize(["*.pyx"]),
)