Spakuj aplikację Pythona wraz z jej zależnościami
Agencja internetowa » Wiadomości cyfrowe » Spakuj aplikację Pythona wraz z jej zależnościami

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
|_ foobara
|_ __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 ./zależności/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ę.

★ ★ ★ ★ ★