Programiranje

Kako uporabiti PyInstaller za ustvarjanje izvršljivih datotek Python

Python, tako zmogljiv in vsestranski, nima nekaj ključnih zmožnosti. Prvič, Python ne ponuja nobenega izvornega mehanizma za sestavljanje programa Python v samostojni izvršljivi paket.

Po pravici povedano, prvotni primer uporabe Pythona ni nikoli zahteval samostojnih paketov. Programi Python so se v glavnem izvajali v sistemih, v katerih je živela kopija tolmača Python. Toda naraščajoča priljubljenost Pythona je ustvarila večje povpraševanje po zagonu aplikacij Python v sistemih brez nameščenega izvajalnega okolja Python.

Več tretjih oseb je oblikovalo rešitve za uvajanje samostojnih aplikacij Python. Najbolj priljubljena rešitev in najbolj zrela rešitev je PyInstaller. PyInstaller postopka pakiranja aplikacije Python ne naredi povsem neboleče, toda tja gre daleč.

V tem članku bomo raziskali osnove uporabe PyInstallerja, vključno s tem, kako deluje PyInstaller, kako uporabiti PyInstaller za ustvarjanje samostojne izvršljive datoteke Python, kako natančno nastaviti izvedljive datoteke Python, ki jih ustvarite, in kako se izogniti nekaterim pogostim pastem z uporabo PyInstallerja.

Ustvarjanje paketa PyInstaller

PyInstaller je paket Python, nameščen z pip (pip namestite pyinstaller). PyInstaller je mogoče namestiti v privzeto namestitev Pythona, vendar je najbolje, da ustvarite navidezno okolje za projekt, ki ga želite zapakirati, in tam namestite PyInstaller.

PyInstaller deluje tako, da prebere vaš program Python, analizira vse uvoze, ki jih opravi, in poveže kopije teh uvoza s svojim programom. PyInstaller bere vaš program od vstopne točke. Če je na primer vstopna točka vašega programa myapp.py, bi tekel pyinstaller myapp.py za izvedbo analize. PyInstaller lahko zazna in samodejno zapakira številne običajne pakete Python, na primer NumPy, vendar boste v nekaterih primerih morda morali navesti namige. (Več o tem kasneje.)

Po analizi kode in odkrivanju vseh knjižnic in modulov, ki jih uporablja, PyInstaller nato ustvari "datoteko s specifikacijami". Skript Python s pripono .spec, ta datoteka vsebuje podrobnosti o tem, kako mora biti zapakirana vaša aplikacija Python. Ko prvič zaženete PyInstaller v svoji aplikaciji, PyInstaller ustvari datoteko s specifikacijami iz nič in jo zapolni z nekaterimi razumnimi privzetimi nastavitvami. Te datoteke ne zavrzite; to je ključ za izboljšanje uvedbe PyInstallerja!

Na koncu PyInstaller poskuša iz aplikacije izdelati izvršljivo datoteko, ki je v paketu z vsemi odvisnostmi. Ko konča, se podmapa z imenom dist (privzeto lahko določite drugo ime) se prikaže v imeniku projekta. Ta pa vsebuje imenik, ki je vaša priložena aplikacija - ima .exe datoteko, ki jo je treba zagnati, skupaj z vsemi knjižnicami in drugimi potrebnimi dodatnimi datotekami.

Vse, kar morate storiti za distribucijo programa, je, da ta imenik zapakirate kot .zip datoteko ali kakšen drug sveženj. Snop je običajno treba izvleči iz imenika, kjer ima uporabnik dovoljenja za pisanje, da se lahko zažene.

Testiranje paketa PyInstaller

Obstaja velika verjetnost, da vaš prvi poskus uporabe PyInstallerja za pakiranje aplikacije ne bo popolnoma uspešen.

Če želite preveriti, ali vaš paket PyInstaller deluje, se pomaknite do imenika, ki vsebuje priloženo izvedljivo datoteko, in zaženite .exe datoteko iz ukazne vrstice. Če se ne zažene, bi morale biti napake, ki jih boste natisnili v ukazni vrstici, namig o tem, kaj je narobe.

Najpogostejši razlog, da paket PyInstaller ne uspe, je, da PyInstaller ni uspel združiti zahtevane datoteke. Takšne manjkajoče datoteke spadajo v nekaj kategorij:

  • Skriti ali manjkajoči uvoz: Včasih PyInstaller ne more zaznati uvoza paketa ali knjižnice, običajno zato, ker je uvožen dinamično. Paket ali knjižnico bo treba določiti ročno.
  • Manjkajo samostojne datoteke: Če je program odvisen od zunanjih podatkovnih datotek, ki jih je treba priložiti programu, PyInstaller nikakor ne ve. Datoteke boste morali ročno vključiti.
  • Manjkajoče binarne datoteke: Tudi tukaj je, če je vaš program odvisen od zunanjega binarnega zapisa, kot je .DLL, ki ga PyInstaller ne more zaznati, ga boste morali ročno vključiti.

Dobra novica je, da PyInstaller ponuja enostaven način za reševanje zgornjih težav. The .spec datoteka, ki jo je ustvaril PyInstaller, vključuje polja, ki jih lahko izpolnimo, da se navedejo podrobnosti, ki jih je PyInstaller zamudil.

Odprite .spec datoteko v urejevalniku besedil in poiščite definicijo Analiza predmet. Nekaj ​​parametrov je bilo posredovanih Analiza so prazni seznami, vendar jih je mogoče urejati, da navedejo manjkajoče podrobnosti:

  • skriti uvoz za skriti ali manjkajoči uvoz: Na ta seznam dodajte enega ali več nizov z imeni knjižnic, ki jih želite vključiti v svojo aplikacijo. Če bi želeli dodati pande in bokehna primer, bi to določili kot['pande', 'bokeh']. Upoštevajte, da zadevne knjižnice mora namestite v isti primerek Pythona, kjer uporabljate PyInstaller.
  • podatkov za manjkajoče samostojne datoteke: Tu dodajte eno ali več specifikacij za datoteke v drevesu vašega projekta, ki jih želite vključiti v svoj projekt. Vsako datoteko je treba poslati kot nabor, ki označuje relativno pot do datoteke v imeniku vašega projekta in relativno pot znotraj distribucijskega imenika, kamor želite datoteko postaviti. Na primer, če ste imeli datoteko ./models/mainmodel.dat ki ste ga želeli vključiti v svojo aplikacijo in ga želite umestiti v ustrezen podimenik v vašem distribucijskem imeniku, bi uporabili ('./models/mainmodel.dat','./models') kot en vnos v skriti uvoz seznam. Upoštevajte, da lahko uporabljate globnadomestne znake -style za določitev več datotek.
  • binarne datoteke za manjkajoče samostojne binarne datoteke: Kot z podatkov, lahko uporabiš binarne datoteke za posredovanje seznama nabora, ki določajo lokacije binarnih datotek v projektnem drevesu in njihove cilje v distribucijskem imeniku. Spet lahko uporabite globnadomestne znake.

Upoštevajte, da je kateri koli od seznamov, ki so bili predani Analiza je mogoče programsko ustvariti prej v .spec mapa. Navsezadnje .spec datoteka je samo skript Python z drugim imenom.

Ko spremenite datoteko .spec datoteko, znova zaženite PyInstaller, da znova zgradite paket. Vendar odslej obvezno posredujte spremenjeno .spec datoteka kot parameter (npr. pyinstaller myapp.spec). Preizkusite izvedljivo datoteko kot prej. Če je še vedno kaj pokvarjeno, lahko znova uredite .spec datoteko in postopek ponavljajte, dokler vse ne deluje.

Ko ste prepričani, da vse deluje, kot je bilo predvideno, boste morda želeli urediti.spec datoteko, da prepreči, da vaša zapakirana aplikacija ob zagonu prikaže okno ukazne vrstice. V EXE nastavitve predmeta v .spec datoteka, nastavkonzola = False. Zatiranje konzole je koristno, če ima vaša aplikacija GUI in če ne želite, da bi lažno okno ukazne vrstice zavajalo uporabnike. Te nastavitve seveda ne spreminjajte, če vaša aplikacija zahteva ukazno vrstico.

Izboljšanje paketa PyInstaller

Ko boste svojo aplikacijo zapakirali s programom PyInstaller in pravilno zagnali, jo boste verjetno želeli nekoliko zmanjšati. Paketi PyInstaller niso znani po tem, da so tanki.

Ker je Python dinamičen jezik, je težko predvideti, kaj bo potrebno med izvajanjem določenega programa. Iz tega razloga, ko PyInstaller zazna uvoz paketa, vključuje vse v tem paketu, ne glede na to, ali ga vaš program dejansko uporablja med izvajanjem.

Tu so dobre novice. PyInstaller vključuje mehanizem za selektivno izključevanje celotnih paketov ali posameznih paketov imenski prostori znotraj paketov. Recimo, da vaš program uvozi paket foo, kar vsebuje foo.bar in foo.bip. Če dejansko veste, da vaš program uporablja samo logiko v foo.bar, lahko varno izključite foo.bip in prihranite nekaj prostora.

Če želite to narediti, uporabite izključuje parameter, poslan v Analiza predmet v .spec mapa. Lahko pošljete seznam imen - moduli na najvišji ravni ali imenski prostori s pikami -, da jih izključite iz paketa. Na primer za izključitev foo.bip, bi preprosto navedli['foo.bip'].

Ena najpogostejših izključitev je tkinter, knjižnica Python za ustvarjanje preprostih medplatformnih grafičnih uporabniških vmesnikov. Privzeto,tkinter in vse njegove podporne datoteke so pakirane s projektom PyInstaller. Če ne uporabljate tkinter v svojem projektu ga lahko izključite z dodajanjem 'tkinter' do izključuje seznam. Izpuščanje tkinter bo zmanjšal velikost paketa za približno 7 MB.

Druga pogosta izključitev so testni apartmaji. Če ima paket, ki ga vaš program uvozi, testni paket, bi lahko bil testni paket vključen v vaš paket PyInstaller. Če v svojem uvedenem programu dejansko ne zaženete preskusne zbirke, jo lahko varno izključite.

Upoštevajte, da je treba pakete, ustvarjene z izključitvami, pred uporabo temeljito preizkusiti. Če na koncu izključite funkcije, ki se uporabljajo v prihodnjem scenariju, ki ga niste predvideli, se bo vaša aplikacija pokvarila.

Nasveti za PyInstaller

  • Zgradite svoj paket PyInstaller na operacijskem sistemu, v katerem nameravate uvesti. PyInstaller ne podpira gradnje med različnimi platformami. Če morate svojo samostojno aplikacijo Python namestiti v sisteme MacOS, Linux in Windows, boste morali namestiti PyInstaller in zgraditi ločene različice aplikacije v vsakem od teh operacijskih sistemov.
  • Sestavite svoj paket PyInstaller med razvojem aplikacije. Takoj, ko veste, da boste svoj projekt uvajali s PyInstallerjem, zgradite svoj .spec datoteko in začnite izboljševati paket PyInstaller vzporedno z razvojem vaše aplikacije. Na ta način lahko med izključevanjem dodate izključitve ali vključitve in preizkusite način uporabe novih funkcij v aplikaciji, ko jih pišete.
  • Ne uporabljajte PyInstallerja--onefile način. PyInstaller vključuje stikalo ukazne vrstice, --onefile, ki celotno vašo aplikacijo zapakira v en samovrhljiv izvršljiv program. To se sliši kot dobra ideja - dostaviti morate samo eno datoteko! - vendar ima nekaj pasti. Vsakič, ko zaženete aplikacijo, mora najprej razpakirati vse datoteke znotraj izvršljive datoteke v začasni imenik. Če je aplikacija velika (na primer 200 MB), lahko razpakiranje pomeni nekajsekundno zamudo. Namesto tega uporabite privzeti način z enim imenikom in vse spakirajte kot .zip mapa.
  • Ustvarite namestitveni program za aplikacijo PyInstaller. Če želite na nek način uvesti aplikacijo, ki ni datoteka .zip, razmislite o uporabi namestitvenega pripomočka, kot je odprtokodni sistem za namestitev Nullsoft Scriptable. Velikosti končnega izdelka doda zelo malo režijskih stroškov in vam omogoča konfiguriranje številnih vidikov namestitvenega postopka, na primer ustvarjanje bližnjic do vaše izvedljive datoteke.
  • Ne pričakujte pospeševanja. PyInstaller jeembalaža sistem, ne aprevajalnikali anoptimizator. Koda, pakirana s PyInstaller, ne deluje hitreje, kot bi se izvajala v izvirnem sistemu. Če želite pospešiti kodo Python, uporabite knjižnico s C-pospeševanjem, ki ustreza nalogi, ali projekt, kot je Cython.

Kako narediti več s Pythonom

  • Vadnica za Cython: Kako pospešiti Python
  • Kako namestiti Python na pameten način
  • Boljše upravljanje Python projektov s Poetry
  • Virtualenv in venv: Razložena navidezna okolja Python
  • Python virtualenv in venv dela in ne sme
  • Razloženi navoji Python in podprocesi
  • Kako uporabljati razhroščevalnik Python
  • Kako uporabiti timeit za profiliranje kode Python
  • Kako uporabiti cProfile za profiliranje kode Python
  • Začnite z async v Pythonu
  • Kako uporabljati asyncio v Pythonu
  • Kako pretvoriti Python v JavaScript (in nazaj)
$config[zx-auto] not found$config[zx-overlay] not found