Czy istnieje sposób na skompilowanie aplikacji Pythona do statycznych binarnych?

Próbuję wysłać mój kod na zdalny serwer, który może mieć zainstalowaną inną wersję Pythona i/lub może nie mieć pakietów, których wymaga moja aplikacja.

W tej chwili, aby osiągnąć taką przenośność, muszę zbudować relocatable virtualenv z interpreterem i kodem. To podejście ma pewne problemy (na przykład, musisz ręcznie skopiować kilka bibliotek do virtualenv, ponieważ --always-copy nie działa zgodnie z oczekiwaniami) i ogólnie powolne.

Istnieje (teoretycznie) sposób na zbuduj sam python statycznie.

Zastanawiam się, czy mógłbym spakować interpreter z moim kodem do jednego pliku binarnego i uruchomić aplikację jako moduł. Coś w tym stylu: ./mypython -m myapp run lub ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application.

Author: roboslone, 2016-10-07

6 answers

Możesz rozwiązać swój problem na dwa sposoby]}

    [6]}Użyj statycznego konstruktora, takiego jak freeze, pyinstaller lub py2exe
  1. Kompilowanie przy użyciu cythona

Wyjaśnię, jak możesz to zrobić za pomocą drugiej, ponieważ pierwsza metoda nie jest cross platform i wersji, i została wyjaśniona w innych odpowiedziach. Ponadto, za pomocą programów takich jak pyinstaller zazwyczaj powoduje ogromne rozmiary plików, gdzie jak za pomocą cython spowoduje plik, który jest KBs w rozmiar

Najpierw zainstaluj cython. Następnie zmień nazwę pliku Pythona (powiedzmy test.py) do pliku pyx

$ sudo pip install cython
$ mv test.py test.pyx

Następnie możesz użyć cythona wraz z GCC, aby go skompilować (Cython generuje plik C z Pythona .pliku pyx, a następnie GCC kompiluje plik C) (w odniesieniu do https://stackoverflow.com/a/22040484/5714445 )

$ cython test.pyx --embed
$ gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl

Uwaga: w zależności od wersji Pythona może być konieczna zmiana ostatniego polecenia. Aby wiedzieć, której wersji Pythona używasz, po prostu użycie

$ python -V

Będziesz miał teraz plik binarny 'test', którego szukasz

Uwaga: Cython jest używany do używania definicji zmiennych typu C do statycznej alokacji pamięci w celu przyspieszenia programów Pythona. Jednak w Twoim przypadku nadal będziesz używać tradycyjnych definicji Pythona.

NOTE2: jeśli używasz dodatkowych bibliotek (jak na przykład opencv), być może będziesz musiał podać im katalog za pomocą opcji-L, a następnie podać nazwę biblioteki za pomocą opcji-l Flagi GCC. Więcej informacji na ten temat można znaleźć w GCC flags

 42
Author: R. S. Nikhil Krishna,
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-05-23 11:54:44

Możesz chcieć zbadać Nuitka . Pobiera kod źródłowy Pythona i konwertuje go do wywołań C++ API. Następnie kompiluje się do pliku binarnego wykonywalnego (ELF na Linuksie). Istnieje już od kilku lat i obsługuje szeroką gamę wersji Pythona.

Prawdopodobnie otrzymasz również poprawę wydajności, jeśli go użyjesz. Polecam.

 3
Author: Prakhar Agarwal,
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
2016-10-18 05:06:17

Opcje zamrażania:

Jednak serwer docelowy powinien mieć środowisko, które chcesz - > powinieneś być w stanie go 'utworzyć'. Jeśli tak nie jest, powinieneś zbudować swoje oprogramowanie tak, aby pasowało do środowiska.

Znalazłem ten podręczny poradnik Jak zainstalować niestandardową wersję Pythona na virtualenv, zakładając, że masz dostęp ssh: https://stackoverflow.com/a/5507373/5616110

W virtualenv, powinieneś być w stanie zainstalować pip cokolwiek i nie powinieneś martwić się o uprawnienia sudo. Oczywiście posiadanie tych i dostępu do menedżera pakietów, takiego jak apt, sprawia, że wszystko jest o wiele łatwiejsze.

 0
Author: iScrE4m,
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-05-23 12:10:10

Prawdopodobnie szukasz czegoś takiego jak Freeze, który jest w stanie skompilować aplikację Pythona ze wszystkimi jego bibliotekami do statycznego pliku binarnego:

Strona PyPi of Freeze

Python Wiki page of Freeze

Sourceforge page of Freeze

 0
Author: asc11,
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
2016-10-15 09:45:07

Aby zamrozić plik wykonywalny Pythona i wysłać go wraz z kodem, umieść go w pustej aplikacji powłoki. Postępuj zgodnie z instrukcjami, jak osadzić Pythona w aplikacji z oficjalnej dokumentacji . Możesz rozpocząć tworzenie przykładowej aplikacji bezpośrednio z przykładowego kodu C podanego na stronie internetowej.

Niech ten program uruchomi Twoją aplikację Pythona za pomocą osadzonego Pythona. Wyślij program, osadzony python, którego używałeś i twój program python. Uruchom ten program.

 0
Author: Boud,
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
2016-10-17 03:03:30

Jeśli jesteś na komputerze Mac, możesz użyć py2app do utworzenia .pakiet aplikacji, który uruchamia Twoją aplikację Django po dwukrotnym kliknięciu na nią.

Opisałem jak połączyć Django i CherryPy w taki pakiet na https://moosystems.com/articles/14-distribute-django-app-as-native-desktop-app-01.html

W artykule używam pywebview do wyświetlenia Twojej strony Django w oknie aplikacji lokalnej.

 0
Author: André Aulich,
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
2016-10-19 16:41:51