Pachetați o aplicație Python cu dependențele sale
Cu ceva timp în urmă am dezvoltat o aplicație în Python. Pentru a seta contextul, a fost vorba despre crearea unui executabil capabil să implementeze un Docker-compose.yml prin aplicarea regulilor de afaceri. Pentru a nu rescrie totul, am creat un proiect în Piton pentru a putea folosi biblioteca Docker-scriere care este tot în Python. Odată funcțională, aplicația mea a trebuit să fie construită într-un singur fișier. Scopul meu era să generați un fișier binar care include toate dependențele acestuia (un pic ca Golang).
Atentie! Generarea unui fișier binar nu vă scutește de instalarea Python pe computer. Fișierul binar nu este o aplicație compilată, ci doar un pachet.
Arhitectură
Mai întâi vei crea un folder foobar în proiectul tău. Acesta va conține toată munca ta.
1
2
3
4
5
6
|
proiect
|_ __main__.py
|_ foobar
|_ __init__.py
|_ __main__.py
|_cli.py
|
Dacă ați dat peste acest articol, este pentru că cunoașteți Python cel puțin la fel de bine ca mine și, prin urmare, știți cum să instalați dependențe la nivel global sau într-un virtualenv.
Personal, îmi desfășoară evoluțiile într-un Docker-container așa că îmi instalez dependențele ca globale.
Iată cum se instalează o dependență.
1
|
$ pip install docopt
|
Apoi puteți lucra la fișierul dvs cli.py. Iată un exemplu de utilizare a bibliotecii docpt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# project/foobar/cli.py
din docpt import docpt
eliberare = "1.0.0"
ajutor= « » » Foobar
Utilizare:
versiunea foobar
Opțiuni:
-h --help Afișează ajutor
Foobar este un proiect open-source fals dezvoltat de Baptiste Donaux.
"" "
Def principal():
argumente = docopt(ajutor)
if argumente[" versiune "]:
imprimare(„versiunea foobar”, versiune)
|
Va fi necesar un fișier pentru a lansa aplicația în curs de dezvoltare (în cazul meu __init__.py este un fișier gol, dar obligatoriu).
1
2
3
4
5
6
|
# project/foobar/__main__.py
din . import cli
if __nume__ == " __mână__ ":
cli.main()
|
Pentru a construi un pachet binar, veți avea nevoie de un punct de intrare (project/__main__.py).
1
2
3
4
5
6
|
# project/__main__.py
din foobar import cli
if __nume__ == " __mână__ ":
cli.main()
|
Acum puteți rula aplicația cu ușurință.
1
2
|
$ python ./foobar/ versiune
(„versiunea foobar”, „1.0.0”)
|
Construiți un binar static
Workflow
Dintr-un proiect curat (fără dependență…), iată pașii care vor fi parcurși.
- Pentru a crea un virtualenv și activează-l
- Instalați dependențe și ieșiți virtualenv
- Ștergeți fișierele și folderele care sunt prezente în virtualenv/lib/python2.7/sites-packages care corespund unui folder țâfnă, un folder cache, la fișiere compilate sau fișiere de informații.
- Creați un folder pentru a construi fișierul final
- Copiați dependențele, sursele și fișierul de intrare în folderul nou creat.
- Creați un folder comprimat (.zip) din conținutul folderului de compilare.
- Creați fișierul „binar” cu un antet pentru a specifica mediul și adăugați la acest fișier conținutul folderului comprimat.
Hardcore
Iată pașii tehnici de urmat.
1
2
3
4
5
6
7
8
9
10
11
12
|
dependențe $ virtualenv
$. ./dependencies/bin/activate
$ pip install docopt
$ dezactivați
$ rm -rf $(find ./dependencies/lib/python2.7/site-packages -print | egrep „(/pip/)|(__pycache__)|(.(pyc|dist-info|so)$)”)
$ mkdir build
$ cp -R ./dependencies/lib/python2.7/site-packages/* ./foobar ./__main__.py ./build/
$ cd ./construi
$ zip -r ../release.zip *
$ ecou „#!/usr/bin/env python” > ../eliberare
$ cat ../release.zip >> ../release
$ chmod +x ../release
|
Concluzie
Acum puteți rula cu ușurință binarul. Își încorporează tot contextul.
1
2
|
$ ./versiunea de lansare
(„versiunea foobar”, „1.0.0”)
|
Această soluție a fost foarte convenabilă pentru mine să implementez o aplicație cu un singur fișier. Puteți descărca arhiva fișierelor de exemplu pentru a reproduce demonstrația mea.