Spakuj aplikację Pythona wraz z jej zależnościami
Jakiś czas temu stworzyłem aplikację w Pythonie. Aby ustawić kontekst, chodziło o stworzenie pliku wykonywalnego zdolnego do wdrożenia docker-compose.yml stosując reguły biznesowe. Aby nie pisać wszystkiego od nowa stworzyłem projekt w Python aby móc korzystać z biblioteki dokować-komponować który jest również w Pythonie. Po uruchomieniu moja aplikacja musiała zostać zbudowana w jednym pliku. Moim celem było wygenerować plik binarny zawierający wszystkie jego zależności (trochę jak Golang).
Uwaga ! Wygenerowanie pliku binarnego nie zwalnia cię z instalacji Pythona na twoim komputerze. Plik binarny nie jest skompilowaną aplikacją, a jedynie pakietem.
Architektura
Najpierw utworzysz folder foobar w Twoim projekcie. Będzie to zawierało całą twoją pracę.
1
2
3
4
5
6
|
projekt
|_ __main__.py
|_ foobar
|_ __init__.py
|_ __main__.py
|_cli.py
|
Jeśli trafiłeś na ten artykuł, oznacza to, że znasz Pythona co najmniej tak dobrze jak ja, a zatem wiesz, jak instalować zależności globalnie lub w virtualenv.
Osobiście prowadzę swoje opracowania w Docker-kontener więc instaluję moje zależności jako globale.
Oto jak zainstalować zależność.
1
|
$ pip zainstaluj docopt
|
Następnie możesz pracować nad swoim plikiem klip.py. Oto przykład z użyciem biblioteki dok.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# projekt/foobar/cli.py
od dok importować dok
uwolnienie= „1.0.0”
pomoc= « » » Foobar
Stosowanie:
Wersja foobara
Opcje:
-h --help Wyświetla pomoc
Foobar to fałszywy projekt open source opracowany przez Baptiste Donaux.
„” ”
def główny():
argumenty = dokument (pomoc)
if argumenty["wersja"]:
wydrukować(„wersja foobara”, wersja)
|
Potrzebny będzie plik do uruchomienia rozwijającej się aplikacji (w moim przypadku __init__.py jest pustym, ale wymaganym plikiem).
1
2
3
4
5
6
|
# projekt/foobar/__main__.py
od . importować Cli
if __nazwa__ == " __ręka__ ":
cli.main()
|
Aby zbudować pakiet binarny, będziesz potrzebować punktu wejścia (projekt/__main__.py).
1
2
3
4
5
6
|
# projekt/__main__.py
od foobar importować Cli
if __nazwa__ == " __ręka__ ":
cli.main()
|
Teraz możesz łatwo uruchomić swoją aplikację.
1
2
|
$ python ./foobar/ wersja
(„wersja foobara”, "1.0.0")
|
Zbuduj statyczny plik binarny
Workflow
Z czystego projektu (bez zależności…), oto kroki, które zostaną wykonane.
- Stworzyć virtualenv i aktywuj go
- Zainstaluj zależności i wyjdź virtualenv
- Usuń pliki i foldery, które są obecne w virtualenv/lib/python2.7/sites-packages, które odpowiadają folderowi pypeć, folder pamięci podręcznej, do skompilowanych plików lub plików informacyjnych.
- Utwórz folder, aby utworzyć plik końcowy
- Skopiuj zależności, źródła i plik wejściowy do nowo utworzonego folderu.
- Utwórz skompresowany folder (.zamek błyskawiczny) zawartości folderu kompilacji.
- Utwórz plik „binarny” z nagłówkiem określającym środowisko i dołącz do tego pliku zawartość skompresowanego folderu.
Hardsex
Oto kroki techniczne, które należy wykonać.
1
2
3
4
5
6
7
8
9
10
11
12
|
$ virtualenv zależności
$. ./dependencies/bin/aktywuj
$ pip zainstaluj docopt
$ dezaktywuj
$ rm -rf $ (znajdź ./dependencies/lib/python2.7/site-packages -print | egrep '(/pip/)|(__pycache__)|(.(pyc|dist-info|so)$)')
$ mkdir kompilacja
$ cp -R ./dependencies/lib/python2.7/site-packages/* ./foobar ./__main__.py ./build/
$ cd ./budować
$ zip -r ../release.zip *
$ przegapić '#!/usr/bin/env python' > ../wydanie
$ cat ../release.zip >> ../release
$ chmod +x ../wydanie
|
Wnioski
Teraz możesz łatwo uruchomić swój plik binarny. Osadza cały swój kontekst.
1
2
|
$ ./wersja wydania
(„wersja foobara”, "1.0.0")
|
To rozwiązanie było dla mnie bardzo wygodne do wdrożenia aplikacji z jednym plikiem. Możesz pobrać archiwum przykładowych plików, aby odtworzyć moją demonstrację.