Mam program w Pythonie 2.6, który może załadować moduły Pythona skompilowane do plików .so przy użyciu Cythona. Użyłem Cythona do skompilowania modułów .py do plików .so i wszystko działa dobrze.
Oto plik setup.py, którego używam z Cythonem:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
Extension("ldap", ["ldap.pyx"]),
Extension("checker", ["checker.pyx"]),
Extension("finder", ["finder.pyx"]),
Extension("utils", ["utils.pyx"]),
]
setup(
name = 'bchecker',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules
)
Więc wiem, że mogę skompilować moduły Pythona za pomocą Cythona (wydaje mi się, że Cython tworzy pliki „C” z moich plików Pythona, a następnie je kompiluje), ale czy mogę skompilować mój główny program w Pythonie do czegoś, co mogę wykonać na platformie Linux? Jeśli tak, to przykład wiersza poleceń Cythona byłby mile widziany. Dzięki.
Odpowiedzi:
Wbrew temu, co Adam Matan a inni twierdzą, to może faktycznie utworzyć pojedynczy wykonywalny plik binarny używając Cython, z pliku czystego Python (.py).
Tak, Cython ma być używany zgodnie z opisem - jako sposób na uproszczenie pisania modułów rozszerzeń C / C ++ dla środowiska wykonawczego CPython python.
Ale, jak nudzo nawiązuje do tego komentarza , możesz użyć
--embed
przełącznika w wierszu poleceń.Oto niezwykle prosty przykład. Robię to ze stacji roboczej Debian Sid, używając python3 i cython3.
Upewnij się, że masz wcześniej zainstalowane pakiety python-dev lub python3-dev .
1) Utwórz bardzo prosty program w Pythonie o nazwie hello.py
2) Użyj Cythona, aby skompilować swój program w Pythonie do C ...
3) Użyj GCC, aby skompilować hello.c do pliku wykonywalnego o nazwie hello ...
gcc -Os -I /usr/include/python3.3m -o hello hello.c -lpython3.3m -lpthread -lm -lutil -ldl
4) Otrzymujesz plik o nazwie hello ...
$ ldd hello linux-vdso.so.1 (0x00007fff273fe000) libpython3.3m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.3m.so.1.0 (0x00007fc61dc2c000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc61da0f000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc61d70b000) libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fc61d508000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc61d304000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc61cf5a000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc61cd52000) libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fc61cb28000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc61c90f000) /lib64/ld-linux-x86-64.so.2 (0x00007fc61e280000)
W tym przypadku plik wykonywalny jest dynamicznie powiązany z Pythonem 3.3 w moim systemie Debian.
5) biegnij cześć ...
Jak widać, przy użyciu tej metody można w zasadzie użyć Cythona do konwersji czystych aplikacji Python na wykonywalny, skompilowany kod obiektowy.
Używam tej metody do znacznie bardziej złożonych aplikacji - na przykład w pełni rozwiniętej aplikacji Python / PySide / Qt.
W przypadku różnych wersji Pythona dostosowujesz gcc
-I
i-l
przełączniki do swoich potrzeb.Następnie możesz spakować plik wykonywalny jako plik dystrybucyjny (.deb itp.), Bez konieczności pakowania plików Python / PySide / Qt - zaletą jest to, że Twoja aplikacja powinna nadal działać nawet po aktualizacji dystrybucji do tego samego wersje Pythona itp. w tej dystrybucji.
źródło
cython --embed -o /tmp/a.c a.py
igcc -Os -I /usr/include/python2.7 -o /tmp/a/tmp/a.c -lpython2.7 -lpthread -lm -lutil -ldl
Spójrz na odpowiedzi na pytanie Czy Cython może skompilować się do pliku EXE? które, w przeciwieństwie do wszystkich innych odpowiedzi tutaj, mówią, że tak, można skompilować do pliku wykonywalnego.
Linki w Embedding Cython wydają się być dobrym miejscem do rozpoczęcia, ale nie jest to głównym celem Cythona, więc nie wiem, jak proste byłoby to.
źródło
Nie wiem, czy to pomoże, czy nie, ale Nudzo ma rację. Możesz to pobrać,
cython --embed -o main.o main.py
a następnie próbuję skompilować wynik za pomocą cl / EHscźródło
Nie możesz, Cython nie jest stworzony do kompilowania Pythona ani przekształcania go w plik wykonywalny.
Aby utworzyć plik .exe, użyj py2exe .
Aby utworzyć pakiet dla systemu Mac lub Linux, użyj standardowego procesu pakowania, ponieważ nie ma nic szczególnego na temat programu języka skryptowego w środowisku Unix env.
źródło
cython --embed
które mogą tworzyć pliki wykonywalne z osadzonym Pythonem.