Pakk en Python-applikasjon med dens avhengigheter
Webbyrå » Digitale nyheter » Pakk en Python-applikasjon med dens avhengigheter

Pakk en Python-applikasjon med dens avhengigheter

For en tid siden utviklet jeg en applikasjon i Python. For å sette konteksten handlet det om å lage en kjørbar som kunne distribuere en Docker-compose.yml ved å anvende forretningsregler. For ikke å skrive om alt, laget jeg et prosjekt i Python for å kunne bruke biblioteket Docker-komponere som også er i Python. Når den var funksjonell, måtte applikasjonen min bygges i en enkelt fil. Målet mitt var å generere en binær fil inkludert alle dens avhengigheter (litt som Golang).

Merk følgende ! Generering av en binær fil fritar deg ikke fra å installere Python på maskinen din. Den binære filen er ikke et kompilert program, men bare en pakke.

arkitektur

Først skal du opprette en mappe foobar i prosjektet ditt. Dette vil inneholde alt arbeidet ditt.

1
2
3
4
5
6
prosjekt
|_ __main__.py
|_ foobar
|_ __init__.py
|_ __main__.py
|_cli.py

Hvis du kom over denne artikkelen, er det fordi du kjenner Python minst like godt som meg og derfor vet hvordan du installerer avhengigheter globalt eller i en virtualenv.

Personlig utfører jeg utviklingen min i en Docker-container så jeg installerer avhengighetene mine som globale.

Slik installerer du en avhengighet.

1
$ pip installer docopt

Deretter kan du jobbe med filen din cli.py. Her er et eksempel med bruk av 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
versjon = "1.0.0"
hjelp= « » »Foobar
Bruk:
foobar versjon
Alternativer:
-h --help Vis hjelp
Foobar er et falsk åpen kildekode-prosjekt utviklet av Baptiste Donaux.
"" "
def main():
argumenter = docopt(hjelp)
if argumenter["versjon"]:
skrive ut("foobar versjon", versjon)

En fil for å starte utviklingsapplikasjonen vil være nødvendig (i mitt tilfelle __init__.py er en tom, men nødvendig fil).

1
2
3
4
5
6
# project/foobar/__main__.py
fra . importere cli
if __navn__ == " __hånd__ ":
cli.main()

For å bygge en binær pakke trenger du et inngangspunkt (project/__main__.py).

1
2
3
4
5
6
# project/__main__.py
fra foobar importere cli
if __navn__ == " __hånd__ ":
cli.main()

Nå kan du kjøre applikasjonen din enkelt.

1
2
$ python ./foobar/ versjon
('foobar-versjon', '1.0.0')

Bygg en statisk binær

Arbeidsflyt

Fra et rent prosjekt (uten avhengighet ...), her er trinnene som vil bli utført.

  • Å lage en virtualenv og aktivere den
  • Installer avhengigheter og avslutt virtualenv
  • Slett filer og mapper som finnes i virtualenv/lib/python2.7/sites-pakker som tilsvarer en mappe pip, en cache-mappe, til kompilerte filer eller informasjonsfiler.
  • Opprett en mappe for å bygge den endelige filen
  • Kopier avhengigheter, kilder og inndatafil til den nyopprettede mappen.
  • Opprett en komprimert mappe (. Zip) av innholdet i build-mappen.
  • Lag den "binære" filen med en overskrift for å spesifisere miljøet og legg til innholdet i den komprimerte mappen til denne filen.

Hardcore

Her er de tekniske trinnene du må følge.

1
2
3
4
5
6
7
8
9
10
11
12
$ virtualenv avhengigheter
$. ./dependencies/bin/activate
$ pip installer docopt
$ deaktivere
$ rm -rf $(finn ./dependencies/lib/python2.7/site-packages -print | egrep '(/pip/)|(__pycache__)|(.(pyc|dist-info|so)$)')
$ mkdir bygge
$ cp -R ./dependencies/lib/python2.7/site-packages/*./foobar./__main__.py./build/
$ cd ./bygge
$ zip -r ../release.zip *
$ savner '#!/usr/bin/env python' > ../slipp
$ cat ../release.zip >> ../release
$chmod +x../release

konklusjonen

Nå kan du enkelt kjøre din binære. Den legger inn hele konteksten.

1
2
$ ./release versjon
('foobar-versjon', '1.0.0')

Denne løsningen var veldig praktisk for meg å distribuere en applikasjon med en enkelt fil. Du kan laste ned eksempelfilarkivet for å reprodusere demonstrasjonen min.

★ ★ ★ ★ ★