Jak kompilować i łączyć wiele modułów Pythona (lub pakietów) za pomocą cythona?

Mam kilka modułów Pythona (zorganizowanych w pakiety), które zależą od siebie . np.

  • Module1
  • Module2: import Module1
  • Module3
  • Module4: import Module3, Module 2, Module 1

Załóżmy, że odpowiedni interfejs do tworzenia aplikacji jest w Module4 i chcę wygenerować Module4.so używając cython. Jeśli postępuję naiwnie, dostaję przedłużenie Module4.so które mogę importować ale Rozszerzenie opiera się na kodzie źródłowym Pythona Module1, Module2, Module3.

Czy istnieje sposób kompilacji tak, aby również Module1, Module2, Module3 były skompilowane i połączone z Module4? Chciałbym unikać robienia wszystkiego ręcznie , np. pierwsza kompilacja Module1.so następnie zmień deklarację importową w Module2, tak aby importować Module1.so zamiast Module1.py, następnie skompiluj Module2 do Module2.so i tak dalej....

Dzięki!

Author: Mannaggia, 2012-07-16

1 answers

Edit. Pierwsze dwie opcje odnoszą się do konkretnego kodu Cythona, czego mi brakowało, to to, że pytanie dotyczy czystych modułów Pythona, więc rozwiązaniem jest opcja 3.

Istnieje kilka opcji:

1. Zobacz "Jak utworzyć hierarchię modułów w pakiecie": https://github.com/cython/cython/wiki/PackageHierarchy

2. Wolę stwierdzenie "include" : http://docs.cython.org/src/userguide/language_basics.html#the-include-statement Mam ich wiele .pyx pliki i wszystkie są zawarte w main.pyx, to wszystko w jednej przestrzeni nazw. Rezultatem jest jeden duży moduł: http://code.google.com/p/cefpython/source/browse/cefpython.pyx

3. Możesz skompilować wszystkie moduły jednocześnie używając setup, dodając więcej niż jedno "rozszerzenie":

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

4. Bardziej efektywna kompilacja-zobacz tutaj .

setup (
    name = 'MyProject',
    ext_modules = cythonize(["*.pyx"]),
)
 12
Author: Czarek Tomczak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-27 05:14:19