Csomagoljon be egy Python-alkalmazást a függőségeivel együtt
Nem sokkal ezelőtt fejlesztettem egy alkalmazást Pythonban. A kontextus beállításához egy olyan végrehajtható fájl létrehozásáról volt szó, amely képes telepíteni a dokkoló-compose.yml üzletszabályzat alkalmazásával. Hogy ne írjak át mindent, létrehoztam egy projektet Piton hogy tudja használni a könyvtárat dokkoló-levélírás ami Pythonban is van. Miután működött, az alkalmazásomat egyetlen fájlba kellett beépíteni. A célom az volt létrehoz egy bináris fájlt, beleértve az összes függőségét (kicsit olyan, mint a Golang).
Figyelem ! A bináris fájl generálása nem mentesíti a Python telepítése alól a gépen. A bináris fájl nem egy lefordított alkalmazás, hanem csak egy csomag.
Építészet
Először létrehoz egy mappát foobar a projektedben. Ez tartalmazza az összes munkáját.
1
2
3
4
5
6
|
program
|_ __main__.py
|_ foobar
|_ __init__.py
|_ __main__.py
|_cli.py
|
Ha találkozott ezzel a cikkel, az azért van, mert legalább olyan jól ismeri a Pythont, mint én, és ezért tudja, hogyan telepíthet függőségeket globálisan vagy virtualenv.
Személy szerint a fejlesztéseimet a Docker-konténer így a függőségeimet globálisként telepítem.
Így telepíthet egy függőséget.
1
|
$ pip install docopt
|
Ezután dolgozhat a fájlon klip.py. Itt van egy példa a könyvtár használatára 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
ból ből docpt importál docpt
verzió= "1.0.0"
segítség = « » » Foobar
Használat:
foobar verzió
Opciók:
-h --help Súgó megjelenítése
A Foobar egy hamis nyílt forráskódú projekt, amelyet a Baptiste Donaux fejlesztett ki.
"" "
def fő-():
argumentumok = docopt(súgó)
if érvek["verzió"]:
nyomtatás(“foobar verzió”, verzió)
|
Szükség lesz egy fájlra a fejlesztő alkalmazás elindításához (az én esetemben __init__.py egy üres, de kötelező fájl).
1
2
3
4
5
6
|
# project/foobar/__main__.py
ból ből . importál cli
if __név__ == " __kéz__ ":
cli.main()
|
Bináris csomag létrehozásához szükség lesz egy belépési pontra (project/__main__.py).
1
2
3
4
5
6
|
# projekt/__main__.py
ból ből foobar importál cli
if __név__ == " __kéz__ ":
cli.main()
|
Most már könnyedén futtathatja az alkalmazást.
1
2
|
$ python ./foobar/ verzió
("foobar verzió", „1.0.0”)
|
Statikus bináris létrehozása
munkafolyamat
Egy tiszta projektből (függőség nélkül…) itt vannak a végrehajtandó lépések.
- A virtualenv és aktiválja azt
- Függőségek telepítése és kilépés virtualenv
- Törölje a mappában található fájlokat és mappákat virtualenv/lib/python2.7/sites-packages, amelyek megfelelnek egy mappának gyümölcsmag, egy gyorsítótár mappa, lefordított fájlokhoz vagy információs fájlokhoz.
- Hozzon létre egy mappát a végső fájl létrehozásához
- Másolja a függőségeket, a forrásokat és a bemeneti fájlt az újonnan létrehozott mappába.
- Hozzon létre egy tömörített mappát (. Zip) a build mappa tartalmából.
- Hozzon létre egy „bináris” fájlt fejléccel a környezet meghatározásához, és fűzze hozzá a tömörített mappa tartalmát ehhez a fájlhoz.
Hardcore
Itt vannak a követendő technikai lépések.
1
2
3
4
5
6
7
8
9
10
11
12
|
$ virtualenv függőségek
$. ./dependencies/bin/activate
$ pip install docopt
$ deaktiválni
$ rm -rf $(találja meg a következőt: ./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 ./épít
$ zip -r ../release.zip *
$ visszhang "#!/usr/bin/env python" > ../release
$ cat ../release.zip >> ../release
$ chmod +x ../kiadás
|
Következtetés
Most már könnyedén futtathatja a bináris fájlt. Minden kontextusát beágyazza.
1
2
|
$ ./kiadási verzió
("foobar verzió", „1.0.0”)
|
Ez a megoldás nagyon kényelmes volt számomra egy alkalmazás egyetlen fájlból történő üzembe helyezéséhez. A bemutatóm reprodukálásához letöltheti a mintafájlok archívumát.