Ippakkja applikazzjoni Python bid-dipendenzi tagħha
Xi żmien ilu żviluppajt applikazzjoni f'Python. Biex jiġi stabbilit il-kuntest, kien dwar il-ħolqien ta 'eżekutibbli kapaċi li juża a docker-compose.yml billi tapplika r-regoli tan-negozju. Sabiex ma nikteb kollox mill-ġdid, ħloqt proġett fi Python biex tkun tista' tuża l-librerija docker-compose li huwa wkoll fil-Python. Ladarba funzjonali, l-applikazzjoni tiegħi kellha tinbena f'fajl wieħed. L-għan tiegħi kien li jiġġenera fajl binarju inkluż id-dipendenzi kollha tiegħu (daqsxejn bħal Golang).
Attenzjoni! Il-ġenerazzjoni ta 'fajl binarju ma teżentikx milli tinstalla Python fuq il-magna tiegħek. Il-fajl binarju mhuwiex applikazzjoni kkumpilata iżda biss pakkett.
arkitettura
L-ewwel se toħloq folder foobar fil-proġett tiegħek. Dan se jkun fih ix-xogħol kollu tiegħek.
1
2
3
4
5
6
|
proġett
|_ __main__.py
|_ foobar
|_ __init__.py
|_ __main__.py
|_cli.py
|
Jekk iltqajt ma' dan l-artiklu, huwa għaliex taf Python mill-inqas kif naf jien u għalhekk taf kif tinstalla dipendenzi globalment jew f' virtualenv.
Personalment, inwettaq l-iżviluppi tiegħi f'a Docker-kontenitur għalhekk ninstalla d-dipendenzi tiegħi bħala globali.
Ara kif tinstalla dipendenza.
1
|
$ pip install docopt
|
Imbagħad tista 'taħdem fuq il-fajl tiegħek cli.py. Hawn eżempju bl-użu tal-librerija 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
minn docpt importazzjoni docpt
rilaxx= "1.0.0"
għajnuna= « » »Foobar
Użu:
verżjoni foobar
Għażliet:
-h --help Uri l-għajnuna
Foobar huwa proġett ta' sors miftuħ falz żviluppat minn Baptiste Donaux.
"" "
def prinċipali():
arguments = docopt (għajnuna)
if argumenti[" verżjoni "]:
jistampa ("verżjoni foobar", verżjoni)
|
Se jkun meħtieġ fajl biex tniedi l-applikazzjoni li qed tiżviluppa (fil-każ tiegħi __init__.py huwa fajl vojt iżda meħtieġ).
1
2
3
4
5
6
|
# project/foobar/__main__.py
minn . importazzjoni cli
if __isem__ == " __id__ ":
cli.main()
|
Biex tibni pakkett binarju, ser ikollok bżonn punt tad-dħul (project/__main__.py).
1
2
3
4
5
6
|
# project/__main__.py
minn foobar importazzjoni cli
if __isem__ == " __id__ ":
cli.main()
|
Issa tista 'tmexxi l-applikazzjoni tiegħek faċilment.
1
2
|
$ python ./foobar/ verżjoni
('verżjoni foobar', '1.0.0')
|
Ibni binarju statiku
Workflow
Minn proġett nadif (mingħajr dipendenza...), hawn huma l-passi li se jitwettqu.
- Biex toħloq virtualenv u attivah
- Installa dipendenzi u ħruġ virtualenv
- Ħassar fajls u folders li huma preżenti fil- virtualenv/lib/python2.7/sites-packages li jikkorrispondu għal folder pip, folder ta' cache, għal fajls ikkumpilati jew fajls ta' informazzjoni.
- Oħloq folder biex tibni l-fajl finali
- Ikkopja id-dipendenzi, is-sorsi u l-fajl tal-input fil-folder maħluq ġdid.
- Oħloq folder kompressat (zip) tal-kontenut tal-folder tal-bini.
- Oħloq il-fajl "binarju" b'header biex tispeċifika l-ambjent u ehmeż ma' dan il-fajl il-kontenut tal-folder kompressat.
Iebsa
Hawn huma l-passi tekniċi li għandek issegwi.
1
2
3
4
5
6
7
8
9
10
11
12
|
$ virtualenv dipendenzi
$. ./dependencies/bin/activate
$ pip install docopt
$ iddiżattiva
$ 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 ./ tibni
$ zip -r ../release.zip *
$ miss '#!/usr/bin/env python' > ../rilaxx
$ cat ../release.zip >> ../release
$ chmod +x ../rilaxx
|
konklużjoni
Issa tista 'faċilment tmexxi l-binarju tiegħek. Tħaddan il-kuntest kollu tagħha.
1
2
|
$ ./verżjoni rilaxx
('verżjoni foobar', '1.0.0')
|
Din is-soluzzjoni kienet konvenjenti ħafna għalija biex niskjera applikazzjoni b'fajl wieħed. Tista' tniżżel l-arkivju tal-fajls tal-kampjun biex tirriproduċi d-dimostrazzjoni tiegħi.