Verpak een Python-toepassing met zijn afhankelijkheden
Enige tijd geleden heb ik een applicatie ontwikkeld in Python. Om de context te bepalen, moest een uitvoerbaar bestand worden gemaakt dat een havenarbeider-compose.yml door bedrijfsregels toe te passen. Om niet alles te herschrijven, heb ik een project gemaakt in Python om gebruik te kunnen maken van de bibliotheek havenarbeider-compose die ook in Python staat. Eenmaal functioneel, moest mijn applicatie in één bestand worden gebouwd. Mijn doel was om genereer een binair bestand inclusief al zijn afhankelijkheden (een beetje zoals Golang).
Aandacht ! Het genereren van een binair bestand stelt u niet vrij van het installeren van Python op uw computer. Het binaire bestand is geen gecompileerde applicatie, maar slechts een pakket.
Architectuur
Eerst maak je een map aan foobar bij uw project. Hierin staat al je werk.
1
2
3
4
5
6
|
project
|_ __hoofd__.py
|_ foobalk
|_ __init__.py
|_ __hoofd__.py
|_clip.py
|
Als je dit artikel bent tegengekomen, betekent dit dat je Python minstens zo goed kent als ik en dus weet hoe je afhankelijkheden globaal of in een virtualenv.
Zelf voer ik mijn ontwikkelingen uit in een Docker-container dus installeer ik mijn afhankelijkheden als globals.
Hier leest u hoe u een afhankelijkheid installeert.
1
|
$ pip installeer docopt
|
Dan kun je aan je dossier werken clip.py. Hier is een voorbeeld met het gebruik van de bibliotheek docopte.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# project/foobar/clip.py
van docopte importeren docopte
loslaten = "1.0.0"
helpen= « » »Fobar
Gebruik:
foobar-versie
Opties:
-h --help Help weergeven
Foobar is een nep-open-sourceproject ontwikkeld door Baptiste Donaux.
"" "
def hoofd-():
argumenten = docopt(help)
if argumenten[" versie "]:
afdrukken("foobar-versie", versie)
|
Er is een bestand nodig om de ontwikkeltoepassing te starten (in mijn geval __init__.py is een leeg maar vereist bestand).
1
2
3
4
5
6
|
# project/foobar/__main__.py
van . importeren cli
if __naam__ == " __hand__ ":
cli.main()
|
Om een binair pakket te bouwen, hebt u een toegangspunt nodig (project/__hoofd__.py).
1
2
3
4
5
6
|
# project/__hoofd__.py
van foobar importeren cli
if __naam__ == " __hand__ ":
cli.main()
|
Nu kunt u uw applicatie eenvoudig uitvoeren.
1
2
|
$ python ./foobar/ versie
('foobar-versie', '1.0.0')
|
Bouw een statisch binair bestand
Workflow
Van een schoon project (zonder afhankelijkheid...), hier zijn de stappen die zullen worden uitgevoerd.
- Om een virtualenv en activeer het
- Installeer afhankelijkheden en sluit af virtualenv
- Verwijder bestanden en mappen die aanwezig zijn in de virtualenv/lib/python2.7/sites-packages die overeenkomen met een map pit, een cachemap, naar gecompileerde bestanden of informatiebestanden.
- Maak een map om het uiteindelijke bestand op te bouwen
- Kopieer afhankelijkheden, bronnen en invoerbestand naar de nieuw gemaakte map.
- Maak een gecomprimeerde map (.zip) van de inhoud van de build-map.
- Maak het "binaire" bestand met een header om de omgeving te specificeren en voeg aan dit bestand de inhoud van de gecomprimeerde map toe.
Hardcore
Dit zijn de te volgen technische stappen.
1
2
3
4
5
6
7
8
9
10
11
12
|
$ virtualenv afhankelijkheden
$. ./dependencies/bin/activeren
$ pip installeer docopt
$ deactiveren
$ 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 ./bouwen
$ zip -r ../release.zip *
$ echo '#!/usr/bin/env python' > ../loslaten
$ kat ../release.zip >> ../release
$chmod +x ../release
|
Conclusie
Nu kunt u eenvoudig uw binaire bestand uitvoeren. Het sluit de hele context in.
1
2
|
$ ./release-versie
('foobar-versie', '1.0.0')
|
Deze oplossing was erg handig voor mij om een applicatie met een enkel bestand te implementeren. U kunt het archief met voorbeeldbestanden downloaden om mijn demonstratie te reproduceren.