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
$ cat hello.py
print ("Witaj świecie!")
2) Użyj Cythona, aby skompilować swój program w Pythonie do C ...
cython3 --embed -o hello.c hello.py
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 ...
$ file witaj
witam: ELF 64-bitowy plik wykonywalny LSB, x86-64, wersja 1 (SYSV), połączony dynamicznie (używa bibliotek współdzielonych), dla systemu GNU / Linux 2.6.32, identyfikator kompilacji [sha1] = 006f45195a26f1949c6ed051df9cbd4433e1ac23, nierozciągnięty
$ 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ść ...
$ ./hello
Witaj świecie!
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.