Pak en Python-applikation med dens afhængigheder
For noget tid siden udviklede jeg en applikation i Python. For at sætte konteksten handlede det om at skabe en eksekverbar, der kunne implementere en havnearbeider-compose.yml ved at anvende forretningsregler. For ikke at omskrive alt, lavede jeg et projekt i Python at kunne bruge biblioteket havnearbeider-skriveikonet som også er i Python. Når den var funktionel, skulle min applikation bygges i en enkelt fil. Mit mål var at generere en binær fil inklusive alle dens afhængigheder (lidt ligesom Golang).
Opmærksomhed ! Generering af en binær fil fritager dig ikke fra at installere Python på din maskine. Den binære fil er ikke et kompileret program, men kun en pakke.
arkitektur
Først skal du oprette en mappe foobar i dit projekt. Dette vil indeholde alt dit arbejde.
1
2
3
4
5
6
|
projekt
|_ __main__.py
|_ foobar
|_ __init__.py
|_ __main__.py
|_cli.py
|
Hvis du er stødt på denne artikel, betyder det, at du kender Python mindst lige så godt som jeg og derfor ved, hvordan du installerer afhængigheder globalt eller i en virtualenv.
Personligt udfører jeg mine udviklinger i en Docker-container så jeg installerer mine afhængigheder som globale.
Sådan installerer du en afhængighed.
1
|
$ pip installer docopt
|
Så kan du arbejde på din fil cli.py. Her er et eksempel med brugen af biblioteket 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
fra docpt importere docpt
version= "1.0.0"
hjælp= « » »Foobar
Anvendelse:
foobar version
Valg:
-h --help Vis hjælp
Foobar er et falsk open source-projekt udviklet af Baptiste Donaux.
"" "
def main():
argumenter = docopt(hjælp)
if argumenter["version"]:
Print ("foobar version", version)
|
En fil til at starte udviklingsapplikationen vil være nødvendig (i mit tilfælde __init__.py er en tom, men påkrævet fil).
1
2
3
4
5
6
|
# project/foobar/__main__.py
fra . importere cli
if __navn__ == "__hånd__":
cli.main()
|
For at bygge en binær pakke skal du bruge et indgangspunkt (project/__main__.py).
1
2
3
4
5
6
|
# project/__main__.py
fra foobar importere cli
if __navn__ == "__hånd__":
cli.main()
|
Nu kan du nemt køre din applikation.
1
2
|
$ python ./foobar/version
('foobar version', '1.0.0')
|
Byg en statisk binær
Workflow
Fra et rent projekt (uden afhængighed...), her er de trin, der vil blive udført.
- At oprette en virtualenv og aktivere den
- Installer afhængigheder og afslut virtualenv
- Slet filer og mapper, der er til stede i virtualenv/lib/python2.7/sites-pakker, der svarer til en mappe pip, en cache-mappe, til kompilerede filer eller informationsfiler.
- Opret en mappe for at bygge den endelige fil
- Kopier afhængigheder, kilder og inputfil til den nyoprettede mappe.
- Opret en komprimeret mappe (. Zip) af indholdet af build-mappen.
- Opret den "binære" fil med en header for at specificere miljøet og tilføj indholdet af den komprimerede mappe til denne fil.
Hardcore
Her er de tekniske trin, du skal følge.
1
2
3
4
5
6
7
8
9
10
11
12
|
$ virtualenv afhængigheder
$. ./dependencies/bin/activate
$ pip installer docopt
$ deaktivere
$ 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 ./byg
$ zip -r ../release.zip *
$ ekko '#!/usr/bin/env python' > ../frigivelse
$ kat ../release.zip >> ../release
$ chmod +x ../release
|
Konklusion
Nu kan du nemt køre din binære. Den indlejrer al sin kontekst.
1
2
|
$ ./release version
('foobar version', '1.0.0')
|
Denne løsning var meget praktisk for mig at implementere et program med en enkelt fil. Du kan downloade eksempelfilarkivet for at gengive min demonstration.