To, co próbuję zrobić, to wysłać mój kod na zdalny serwer, na którym może być zainstalowana inna wersja języka Python i / lub może nie mieć pakietów wymaganych przez moją aplikację.
W tej chwili, aby osiągnąć taką przenośność, muszę zbudować relokowalny virtualenv z interpreterem i kodem. Takie podejście ma pewne problemy (na przykład, musisz ręcznie skopiować kilka bibliotek do swojego virtualenv, ponieważ --always-copy
nie działa zgodnie z oczekiwaniami) i ogólnie powolne.
Istnieje (w teorii) sposób na statyczne zbudowanie samego Pythona.
Zastanawiam się, czy mógłbym spakować interpreter z moim kodem do jednego pliku binarnego i uruchomić moją aplikację jako moduł. Coś takiego: ./mypython -m myapp run
lub ./mypython -m gunicorn -c ./gunicorn.conf myapp.wsgi:application
.
Odpowiedzi:
Istnieją dwa sposoby rozwiązania problemu
pyinstaller
, lubpy2exe
cython
Wyjaśnię, jak możesz to zrobić za pomocą drugiej, ponieważ pierwsza metoda nie jest wieloplatformowa i wersja, i została wyjaśniona w innych odpowiedziach. Ponadto używanie programów takich jak pyinstaller zwykle powoduje ogromne rozmiary plików, przy czym użycie cythona spowoduje powstanie pliku o rozmiarze KB
Najpierw zainstaluj
cython
. Następnie zmień nazwę pliku Pythona (powiedzmytest.py
) na.pyx
plikNastępnie możesz użyć
cython
razem z GCC do skompilowania go (cython
generuje plik C z pliku Python.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 dowiedzieć się, której wersji Pythona używasz, po prostu użyj
Będziesz mieć teraz plik binarny „test”, którego szukasz
Inne uwagi :
opencv
na przykład), może być konieczne dostarczenie im katalogu za pomocą,-L
a następnie określenie nazwy biblioteki używanej-l
we flagach GCC. Więcej informacji na ten temat można znaleźć w sekcji Flagi GCCźródło
cythonize -i file_0.py [...] file_n.py
dla wszystkich modułów Pythona, a następniecython main_file.py --embed
dla głównego skryptu. Otrzymasz pliki wykonywalne i .so (.dll, .dylib w zależności od systemu operacyjnego), których możesz używać razem jako samodzielne rozwiązanie.Możesz chcieć zbadać Nuitka . Pobiera kod źródłowy Pythona i konwertuje go na wywołania API C ++. Następnie kompiluje się do wykonywalnego pliku binarnego (ELF w systemie Linux). Istnieje już od kilku lat i obsługuje szeroką gamę wersji Pythona.
Prawdopodobnie uzyskasz również poprawę wydajności, jeśli go użyjesz. Zalecana.
źródło
Prawdopodobnie szukasz czegoś takiego jak Freeze, który jest w stanie skompilować twoją aplikację Python ze wszystkimi jej bibliotekami do statycznego pliku binarnego:
Strona PyPi w Freeze
Strona Wiki Pythona dotycząca Freeze
Strona Sourceforge w Freeze
źródło
Jeśli korzystasz z komputera Mac, możesz użyć py2app, aby utworzyć pakiet .app, który uruchamia aplikację Django po dwukrotnym kliknięciu.
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świetlania Twojej strony Django w lokalnym oknie aplikacji.
źródło
Opcje zamrażania:
Jednak serwer docelowy powinien mieć żądane środowisko -> powinieneś być w stanie je „stworzyć”. Jeśli tak się nie stanie, powinieneś zbudować oprogramowanie tak, aby pasowało do środowiska.
Znalazłem ten przydatny przewodnik, jak zainstalować niestandardową wersję Pythona na virtualenv, zakładając, że masz dostęp do ssh: https://stackoverflow.com/a/5507373/5616110
W virtualenv powinieneś być w stanie zainstalować wszystko za pomocą pip i nie powinieneś martwić się o uprawnienia sudo. Oczywiście posiadanie ich i dostęp do menedżera pakietów, takiego jak apt, znacznie ułatwia wszystko.
źródło