Python alkalmazások telepítése
dokumentum verziók:
- 1.0 verzió(2001.01.19.): ezt már használhatónak itéltem
Sok szó eset már a Python-ban, mint objektum orientált programozási nyelvben, megbúvó
lehetőségekről, de az elkészült alkalmazás telepítéséről még nem. Ezért most a lehetséges
alternatívákról és eszközökről adok egy rövid áttekintést. Elsősorban win32-ra vonatkozóan
kaptok segítséget ebből a cikkből, ámbár az ismertetett eszközök egy része más platformon
is működik ill. a módszer adaptálható.
A legkézenfekvőbb megoldás
Természetesen a legegyszerűbb megoldás, ha telepítjük a Python-t és az összes szükséges
kiegészítő csomagot(pl. win32all) a célgépre. Egyébként ez nem is annyira földtől elrugaszkodott
ötlet, hiszen a teljes fejlesztői környezet telepítése nem jár licensz problémákkal és az elfoglat
hely sem katasztrófális(nálam a Python, win32all és a wxPython együttes helyfoglalása 33.4 Mb).
Azoknak, akik forrásuk olvashatósága miatt "rettegnek": nem csak ez, de a lentebb ismertetett
alternatívák sem tudják ezt megakadályozni, sőt az sem véd meg ha csak a lefordított pyc
kiterjesztésű fájlokat másolod fel a kliens gépére! Ha félted a szellemi kincsedet, akkor azt ne
Python-ban kódold...
Nem egy linux disztribúciónak már eleve része a Python, ezért ott sokszor a megfelelő verzió
megléte okozhat gondot.
Ha ezt az utat választod, akkor Python 2.0-tól része az alapcsomagnak a Distutil csomag, amit
esetleg érdemes áttanulmányoznod. A csomag célja szabványos technológát adni arra, hogyan adjunk
telepített Python-unkhoz a standard csomagnak nem részét képező kiterjesztéseket, modulokat.
Lehetséges exe-t csinálni python programunkból?
A válasz röviden igen, kicsit hosszabban igen, de...ez nem igazi exe egyik megoldás esetében
sem. Az exe-be beágyazva mindig ott lapul egy Python interpreter/bytecode. Kérdés, hogy a Microsoft .NET
platformján hogyan fog ez működik, mintha Mark Hammond(aki ezen a porton dolgozik) szerint ott is
lesz Python interpreter, de ezt ne vegyétek készpénznek.
Exe gyártási alternatívák:
- A Python forrás disztribúciójának része a Freeze_. A Freeze.py összeszedi a programod
által használt modulokat, lefordítja őket és egyetlen C byte tömbbe pakolja őket. Az így
előállított C tömböhöz hozzá kell pakolni egy C programot, ami tudja "mire jó" a tömb.
Amennyiben csak statikus lib-ekkel fordítod le, akkor kaptál egy böszme futtatható exe-t, ami
mindenkit tartalmaz aki kell, ha viszont vannak dinamikus lib-jeid is(Windows alatt mindig így van),
akkor a célgépre nem csak az exe-t hanem a szükséges dinamikus lib-eket is disztributálnod kell.
A módszer Linux és Windows(meg az össze többi platform) alatt is használható, viszont kell
hozzá egy C fordító is.
- Fredrik Lundh Sqeeze modulja.
Sqeeze - hasonlóan az előtőhöz - összeszedi a programod által használt modulokat, lefordítja
őket, de - ellentétben a Freeze.py-vel - egy bináris (esetleg tömöríttett) csomagot készít belőle.
Valamint egy módosított import utasítást használ, ami először ebben a bináris csomagban keresgél.
Ez a módszer is használható Linux-on és Windows-on is. Magam sosem használtam, így azt sem tudom
vajon működőképes-e az újabb Python verzókkal.
- Gordon McMillan az előzőek bizonyos funkconalitására építve összeállított egy a korábbiaknál
komfortosabb és sokoldalúbb megoldást, amit alább ismertetek.
- Python2C: eliminálja a byte-code interpretert, mert
olyan C forrást állít elő mintha C-ben programoznál Python API-kat használva. Elég rég nem fejlesztik.
Ez az eszköz Linux-on és Windows-on is használható, bár nem mindent tud minegyik platformon.
A linuxos verziót még nem kellett használnom ezért erről nem tudok mit mondani. Fontos
megjegyeznem, hogy az import, a környezeti változók stb. átírásával saját programunk és az általa
használt python modulok, bináris fájlok teljesen elszeparálhatók a célrendszeren már meglevőktől.
Azaz nincs keveredés a különböző verziók között és nem rontod el a már telepített és működő
rendszert sem. Windows-on a következő lehetőségeink vannak:
- Simple.py: két exe-t gyárt, az egyik egy komplett telepítő míg a másik a scriptedet és
az általa használt python modulokat tartalmazza. A telepítő fapados: kér egy könyvtárat
ahová kicsomagolja a scriptedet és a kapcsolódó python modulokat tartalmazó exe-t, valamint
az összes használt bináris fájlt. Használata: python ../Simple.py myscript.py [-d -tk].
A -d flag-gel debug verzió állítható elő, a -tk flag pedig akkor kell ha Tk támogatásra is
szüksége van script-ünknek. Tk támogatás kérése előtt le kell futtatnunk a SetupTK.py
script-et, hogy az installer összeszedje és lementse fejlesztői gépünk Tcl/Tk beállításait.
Erre csak egyetlen egyszer a legelső -tk flag használat előtt van szükség!
- Standalone.py: egy exe-t gyárt, ami a scriptedet és az általa hsznált python modulokat
tartalmazza, valamint egy könyvtárba gyűjti az összes bináris fájlt, amire programodnak
szüksége van. Használata: python ../Standalone.py myscript.py [-d -tk]. A flag-ek
jelentése megegyezik a Simple.py-nél ismertetettekkel. Amennyiben egy rendes kinézetű
windows-os telepítőt szeretnél összeütni, akkor mindenképpen ezt kell használni. A
Standalone.py összeszedi a szükséges fájlokat és csinál neked egy exe programot, majd
valamilyen setup gyártó progival(Wise,InstallShield,Inno Setup stb.) az összeszedett
fájlok alapján csinálsz egy telepítőt. Az általam favorizált Inno Setup-ról lentebb
találsz egy pár soros ismertetőt.
- Builder.py: egy vagy több paraméterként kapott config fájl alapján dolgozik. Simple.py
és Standalone.py is config fájlt készít, ami alpján a Builder.py előállítja a kívánt
eredmény fájlokat. A config fájl szerkezetét illetően fordulj a dokumentációhoz. Az én
gyakorlatomban a Builder.py akkor kellett, mikor a Simple.py-vel előállított telepítő
nem az elvárt módon működött. Ebben az esetben a Simple.py által generált config fájlt
kézzel módosítottam és a későbbiekben már csak a Builder.py-t használtam(Simple.py
felülírta volna a módosított config fájlt az eredeti verzióval). Például ilyen eset
az is, hogy command ablakos interpretert akarunk vagy nem(alapértelmezés: igen).
Ha valamiért elszállnának a fenti scriptek vagy hibás végeredményt kreálnának, akkor nézzétek meg
a generált .cfg fájlt, majd a Builder.log-ot. A log értelemezéséhez jó tudni, hogy a .cfg minden
szekciója egy "célobjektumnak" felel meg és a log ezek előállításának részeredményeit tükrözi.
Az aktuális verzók innen letölthetőek. Külön verzó
van Python 1.52-höz és Python 2.0-hoz. Itt találsz leírást a belső működésről, az exe felépítéséről stb.
Nem kötődik szorosan a Python-hoz, hiszen bármilyen windows-os telepítőt gyárthatsz vele (én
még Visual Basic programok telepítésére is ezt használom és nem a beépített varázslóval
előállítható meglehetősen bizonytalanul működő telepítőt). Miért ajánlom a figyelmedbe:
- A fentebb ismertetet Standalone.py-vel együtt használva viszonylag kis munkával
elegáns windows-os telepítőt tudsz készíteni vele.
- Text fájl alapú konfigurálhatóság, így nem veszel el a füles lapok erdejében sőt ez
egyszerűen generálható programból is.
- Sokat tud, még nem volt vele olyan problémám, amit ne tudtam volni kis ráfordítással
megoldani.
- A helpje célszerűen a használathoz szükséges infókat tartalmazza és nem
marketing szövegek tömkelegéből kell kihámoznom a lényeget.
- Lelkes honfitársunk magyarította az üzenetit, sőt más hasonlóan lelkes emberek ezt
több nyelvre is megtették.
- Ingyen van.
Néhány fontos link:
- Az eredeti Inno Setup innen tölthető le
- My Inno Setup Extension: modernebb kinézet és plussz funkciók(én ezt használom)
- Ha a notepad nem elég és szines-szagos Inno Setup script-et szerkesztő programra is vágysz, akkor
ezt próbáld ki.
Milyen problémák vannak:
- import nem találja meg a PyWinTypes20.dll-t és a PythonCOM20.dll-t, mert más a fájlnév és
más a modulnév(pywintypes és pythoncom). Ha ezeket használja programod, akkor az indító
scriptedben e modulok importja elé tedd be ennek a modulnak
az importját. A modulban a fájlneveknél figyelni kell a megfelelő verziószám szerepeltetésére(20 vagy 15).
- Módosítani kell Simple.py és Standalone.py legelején a sablont. Ki kell venni belőlük a
"excludes = PyWinTypes20.dll, win32api" sort, ami azért van mert os modul kapcsán akkor is
bekerülne az eredménybe ez a két fájl amikor nincs is rájuk szükség.
- Az archive_rt.py-be az importok után be kell írni egy sort: sys.path.append(imputil.BuiltinImporter()).
Ez sajna hiba a 3i verzióban és nem csak COM esetén kell, hanem ha a forrásodban builtin modulokat(pl. new)
akarsz importálni. Legjobb, ha eleve hozzáveszed ezt a sort.
- Az elkészített exe az aktuális könyvtárban hiányolni fogja a win32com\gen_py alkönyvtárat, ezért
telepítéskor létre kell hozni azt.
- COM szerver esetében a fentieken kívül még a célgépen a regisztráció megoldása is gond, valamint
a COM működéséből kifolyólag az installer nem szed össze mindent fájlt, amire szükség van.
A fentiek figyelembe vételével a Python-ban írt COM klienseknél következő a menetrend:
- A főmodulba az inportok elé betesszük az "import magic_import" sort
- Standalone.py-ből kivesszük a "excludes = PyWinTypes20.dll, win32api" sort.
- Lefuttatjuk a Standalone.py-t
- Az így összeszedett fájlok alapján elkészítjük a telepítőt.
Python-ban írt COM szerverekhez is lehet a fenti nódon telepítőt készíteni, csak működni
nem fog. A legnagyobb baj az, hogy a regisztrációs szkriptek nincsenek felkészítve arra, hogy
nincs külön python interpreter ill. hogy a COM komponensünket implementáló script nem létezik a
fájlrendszerben hanem az exe-ben van elrejte. Arra sem jön rá az installer, hogy a COM komponensünk
működéséhez szükség van a localserver.py-re és az összes általa használt szkriptre (mert a localserver.py-re
nincs hivatkozás, csak a regisztráció során a registry-be kerül be a hivatkozás).
Az előbbi rengeteg zűrös kérdés miatt feladtam az exe formátumú terjesztés lehetőségét, hanem
helyette némi ügyeskedéssel egy minimális Python és Python COM-ot rakok össze amit aztán Inno Setup
segítségével gyúrok össze telepítővé(vagy éppenséggel egy meglevő Inno Setup script részévé teszem).
Az Inno Setup azért "kell", hogy a telepítővel a regisztrációt is meg tudjam oldani. Ha egy komplett
alkalmazás részeként akarom Python COM komponenseimet terjeszteni, akkor persze az ahhoz használt telepítő
legalább olyan jó mint az Inno Setup:-).
Innen tudod letölteni a PyCOMDist.zip csomagot, ami segítségedre lehet Python-ban írt COM komponensek telepítésében.
A "Python és COM, II. rész" című cikkemben szereplő dynamit.py COM szerverhez letölthettek egy minta
Inno Setup szkriptet. A PyCOMDist.zip csomagban levő FullCollect.py segítségével
generájátok le ti is a könyvtárszerkezetet, tegyétek be ezt a szkriptet a dist_dynamit könyvtárba,
aktulizáljátok benne a könyvtárneveket és végül fordítsátok le az Inno Setup-al.
Összegzés
Tudom mindez arra kevés, hogy a fenti eszközökkel gond nélkül boldoguljatok. Az egész cikket
elsősorban áttekintésnek szántam és csak a lehetőségeket kívántam felvillantani.
A telepítőt tesztelni is kell. Erre nálam a vmware vált be. A vmware
ad egy virtuális gépet és így operációsrendszert futtathatsz az operációs rendszerben, sőt egyszerű
fájlmásolással tudod lementeni az operációs rendszeredet. Igy nem kell külön gép, külön partíció csak licensz
a tesztelendő Windows-hoz. Linux-on is fut a vmware és Linux-ot is tud futtatni. Sajna nem ingyenes, de az ára
megfizethető és egy hónapra érvényes teszt licenszet(nincs benne az időn kívül más korlátozás) is lehet kérni tőlük.
Kiss Árpád