Как скомпилировать и связать несколько модулей (или пакетов) python с помощью cython?
У меня есть несколько модулей python (организованных в пакеты), которые зависят друг от друга . например
- Module1
- Module2: импорт Module1
- Module3
- Модуль 4: импортирует модуль 3, модуль 2, модуль 1
Предположим, что соответствующий интерфейс для разработки приложений находится в модуле 4, и я хочу сгенерировать Module4.so с использованием cython . Если я начну наивно, я получаю расширение Module4.so, которое я могу импортировать, но расширение использует исходный код python Module1, Module2, Module3.
Есть ли способ скомпилировать, чтобы модули Module1, Module2, Module3 были скомпилированы и связаны с Module4? Я хотел бы избежать выполнения всего вручную , например, сначала скомпилировать Module1.so, а затем изменить объявление импорта в Module2, чтобы импортировать Module1.so, а не Module1.py, затем скомпилируйте Module2 в Module2.so и так далее ….
Благодаря!
Редактировать. Первые два варианта относятся к конкретному коду Cython, то, что я пропустил, заключается в том, что речь идет о чистых модулях python, поэтому вариант 3 является решением.
Есть несколько вариантов:
1. См. «Как создать иерархию модулей в пакете»: https://github.com/cython/cython/wiki/PackageHierarchy
2. Я предпочитаю оператор «include»: 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"]), )