Python, kraftig og allsidig som den er, mangler et par viktige evner ut av boksen. For en, Python gir ingen innebygd mekanisme for å lage en Python-programmet inn i en frittstående kjørbare pakken.

for Å være rettferdig, den opprinnelige bruken som er tilfellet for Python aldri kalt for frittstående pakker. Python-programmer har, av og store, blitt kjørt i-plass på systemer der en kopi av Python-tolkeren bodde. Men den buldrende populariteten av Python har skapt større behov for å kjøre Python-programmer på systemer med ikke installert Python runtime.,

Flere tredjeparter har utviklet løsninger for distribusjon av frittstående Python-programmer. Den mest populære løsningen av gjengen, og de mest modne, er PyInstaller. PyInstaller ikke gjøre prosessen med pakking et Python-appen til å gå helt smertefritt, men det går en lang vei dit.

I denne artikkelen vil vi utforske grunnleggende bruk av PyInstaller inkludert hvordan PyInstaller fungerer, hvordan å bruke PyInstaller å opprette en frittstående Python kjørbar, hvordan å finjustere Python-kjørbare filer du oppretter, og hvordan du kan unngå noen av de vanligste fallgruvene som går med ved hjelp av PyInstaller.,

Opprette en PyInstaller pakken

PyInstaller er en Python-pakken installert med pip (pip install pyinstaller). PyInstaller kan være installert i din standard Python-installasjon, men det er best å opprette et virtuelt miljø for prosjektet du ønsker å pakke og installere PyInstaller det.

PyInstaller fungerer ved å lese din Python-program, som ved analysering av alle som importerer den gjør, og bunting kopier av de som er import med programmet. PyInstaller leser i programmet fra inngangspunkt., For eksempel, hvis programmet er inngangspunkt er myapp.py, kan du kjøre pyinstaller myapp.py for å utføre analysen. PyInstaller kan oppdage og automatisk pakke mange vanlige Python-pakker, som NumPy, men det kan hende du trenger for å gi hint i noen tilfeller. (Mer om dette senere.)

Etter å analysere koden din og kan oppdage alle biblioteker og moduler bruker, PyInstaller deretter genererer en «spec-fil.»Et Python-skript med filtypen .spec denne filen inneholder informasjon om hvordan din Python-app trenger å bli pakket opp., Første gang du kjører PyInstaller på appen din, PyInstaller vil generere en spec-fil fra scratch og fylle den med noen fornuftig standarder. Ikke kast denne filen, det er nøkkelen til raffinering en PyInstaller distribusjon!

til Slutt, PyInstaller forsøk på å produsere en kjørbar fra app, sammen med alle dets avhengigheter. Når det er ferdig, en undermappe som heter dist (av som standard, men du er fri til å angi et annet navn) vil vises i prosjektet katalogen., Dette i sin tur inneholder en katalog som er buntet app — det har en .exe – filen for å kjøre, sammen med alle biblioteker og andre supplerende filer som kreves.

Alt du trenger å gjøre for å distribuere programmet ditt, da, er å pakke opp denne katalogen som en .zip fil eller noen andre bunt. Pakken vil vanligvis trenger å bli hentet i en katalog der brukeren har skrive tillatelser for å kjøre.

IDG

En .spec-fil er brukt til å opprette en kjørbar med PyInstaller., Merk navnerom som er oppført i excludes. Disse vil bli tatt ut av laget bundle for å spare plass.

Teste en PyInstaller pakken

Det er en fair sjanse første forsøk på å bruke PyInstaller å pakke en app ikke vil bli helt vellykket.

for Å sjekke om din PyInstaller pakken fungerer, kan du navigere til mappen som inneholder den medfølgende kjørbar og kjøre .exe fil det fra kommandolinjen., Hvis det mislykkes å kjøre, at feil vil du se som skrives ut til kommando-linjen skal gi et hint om hva som er galt.

Den vanligste årsaken til at en PyInstaller pakken mislykkes er at PyInstaller ikke klarte å pakke en nødvendig fil. En slik manglende filer faller inn i noen kategorier:

  • Skjult eller mangler import: noen Ganger PyInstaller ikke kan påvise importere en pakke eller et bibliotek, vanligvis fordi det er importert dynamisk. Pakken eller biblioteket må være manuelt angitt.,
  • Mangler frittstående filer: Hvis programmet avhenger av eksterne data filer som trenger å være sammen med programmet, PyInstaller har ingen måte å vite. Du må manuelt inkluderer filer.
  • Mangler binærfiler: Her igjen, hvis programmet er avhengig av en ekstern binære som en .DLL-fil som PyInstaller ikke kan oppdage, du trenger å manuelt ta det med.

Den gode nyheten er at PyInstaller gir en enkel måte å håndtere de ovennevnte problemer., .spec fil som er opprettet av PyInstaller inkluderer felt vi kan fylle ut for å gi detaljer som PyInstaller savnet.

Åpne .spec – filen i et tekstredigeringsprogram, og ser for definisjonen av Analysis objekt. Flere av parameterne som sendes til Analysis er blanke lister, men de kan redigeres for å angi manglende detaljer:

  • hiddenimports for skjult eller mangler import: Legge til denne listen ett eller flere strenger med navn på biblioteker du vil ha inkludert med din app., Hvis du ønsker å legge til pandas og bokeh, for eksempel, ville du angi at som . Vær oppmerksom på at bibliotekene i spørsmålet må være installert på samme forekomst av Python hvor du kjører PyInstaller.
  • datas for manglende frittstående filer: Legge til ett eller flere spesifikasjoner for filene i prosjektet treet som du ønsker å ha med i prosjektet., Hver fil har til å bli vedtatt som en tuple som angir den relative banen til filen i ditt prosjekt-katalogen og den relative banen innenfor distribusjon katalogen der du ønsker å plassere filen. For eksempel, hvis du hadde en fil ./models/mainmodel.dat at du ønsket å ha med i appen din, og du ønsker å plassere den i en matchende undermappe i din distribusjon katalogen, kan du bruke ('./models/mainmodel.dat','./models') som en oppføring i hiddenimports liste. Merk at du kan bruke glob-stil jokertegn for å angi mer enn én fil.,
  • binaries for manglende frittstående binærfiler: Som med datas, kan du bruke binaries for å passere en liste av tupler som angir plasseringen av binærfiler i prosjekt treet og sine destinasjoner i fordelingen katalogen. Igjen, kan du bruke glob-stil jokertegn.

husk at noen av listene sendes til Analysis kan være programmatisk generert tidligere i .spec – filen., Tross alt, .spec filen er bare et Python-skript ved et annet navn.

Etter at du gjør forandringer til .spec fil, kjører PyInstaller å gjenoppbygge pakken. Men, fra nå av, være sikker på å passere den modifiserte .spec fil som parameter (f.eks. pyinstaller myapp.spec). Test den kjørbare filen som før. Hvis noe er fremdeles ødelagt, kan du re-edit .spec fil og gjenta prosessen til alt fungerer.,

til Slutt, når du er fornøyd alt fungerer som tiltenkt, kanskje du ønsker å redigere .spec – filen for å forhindre at dine pakket app fra presentere et kommandolinje-vindu da den ble lansert. I EXE objekt innstillinger i .spec – filen, angi console=False. Å undertrykke konsollen er nyttig hvis din app har en GUI og du ikke ønsker en falsk kommandolinje-vindu ledende brukere er på avveie. Selvfølgelig, må du ikke endre denne innstillingen hvis programmet krever en kommandolinje.,

Raffinering en PyInstaller pakken

Når du har din app pakket med PyInstaller og fungerer som det skal, den neste tingen du vil sannsynligvis ønske å gjøre er å slanke det ned litt. PyInstaller pakker er ikke kjent for å være slanke.

Fordi Python er et dynamisk språk, er det vanskelig å si akkurat hva som vil være nødvendig ved kjøring av et gitt program. Derfor, når PyInstaller oppdager en pakke import, det inkluderer alt i pakken, uansett om eller ikke det er faktisk brukes ved kjøring av programmet.

Her er de gode nyhetene., PyInstaller inneholder en mekanisme for selektivt å ekskludere hele pakker, eller enkelte navnerom i pakker. For eksempel, la oss si at programmet import pakken foo, som inkluderer foo.bar og foo.bip. Hvis du vet for et faktum at programmet bare bruker logikk i foo.bar, kan du trygt utelukke foo.bip og spare litt plass.

for Å gjøre dette, bruker du excludes parameter gått til Analysis objekt i .spec – filen., Du kan sende en liste over navn — topp-nivå moduler, eller prikkete navnerom — å ekskludere fra din pakke. For eksempel, for å utelukke foo.bip, ville du bare angi .

IDG

ytelsen katalog opprettet av PyInstaller. På grunn av det store antall filer i den katalogen, en tredje-part installer prosjekt som NSIS kan brukes til å pakke opp katalogen inn i en selvutpakkende, arkiv, og automatisk opprette en snarvei til den kjørbare filen.,

En felles utelukkelse du kan gjøre er tkinter, Python library for å lage enkle, cross-platform grafiske brukergrensesnitt. Som standard tkinter og alle dens støtte for filer som er pakket med en PyInstaller prosjektet. Hvis du ikke bruker tkinter i prosjektet ditt, kan du utelate det ved å legge til 'tkinter' til excludes liste. Utelating av tkinter vil redusere størrelsen på pakken med rundt 7 MB.

en Annen vanlig utelukkelse er testsuiter., Hvis en pakke programmet import er en test suite, test suite kan ende opp med å bli inkludert i din PyInstaller pakken. Med mindre du faktisk kjøre test suite i distribuert program, kan du trygt utelukke det.

husk at pakker som er opprettet ved hjelp av unntakene bør være grundig testet før de blir brukt. Hvis du ender opp med unntak av funksjonalitet som er brukt i noen fremtid du ikke kan forutse, app vil bryte.

PyInstaller tips

  • opprett din PyInstaller pakken på OS du har tenkt å distribuere på., PyInstaller ikke støtter cross-plattform bygger seg opp. Hvis du trenger å distribuere din frittstående Python-appen på MacOS, Linux og Windows-systemer, så du må installere PyInstaller og bygge separate versjoner av app-en på hver av disse operativsystemene.
  • opprett din PyInstaller pakke som du utvikler din app. Så snart du vet at du vil være distribusjon av prosjektet med PyInstaller, bygge din .spec filen og start raffinering PyInstaller pakken parallelt med utviklingen av appen din., På denne måten kan du på legg til ekskluderinger-eller ting som du går, og test den måten nye funksjoner som distribueres med app som du skriver dem.
  • bruk ikke PyInstaller er --onefile modus. PyInstaller inkluderer en kommandolinjebryter, --onefile, som gir deg hele appen i en enkelt selvutpakkende kjørbar. Dette høres ut som en god idé — du har bare å levere en fil! — men det er noen fallgruver. Når du har kjørt programmet, må det først pakk ut alle filene i den kjørbare filen til en midlertidig katalog., Hvis appen er stor (200MB, for eksempel), utpakking kan bety en forsinkelse på noen sekunder. Bruk standard single-directory-modus i stedet, og bare pakke alt opp som en .zip – filen.
  • Lag et installasjonsprogram for din PyInstaller app. Hvis du ønsker noen måte å distribuere appen annet enn en .zip-fil, kan du vurdere å bruke et installasjonsprogram verktøy som åpen kildekode Nullsoft Skriptbare Installere Systemet. Det legger svært lite overhead til størrelsen på ytelsen og lar deg konfigurere mange aspekter av installasjonen, som å lage snarveier til dine kjørbare.,
  • ikke forvente speedups. PyInstaller er en emballasje system, ikke en kompilator eller en optimizer. Koden pakket med PyInstaller ikke kjøre fortere enn det ville gjort når du kjører på det opprinnelige systemet. Hvis du ønsker å fremskynde Python-kode, kan du bruke et C-akselerert bibliotek egnet til oppgaven, eller et prosjekt som Cython.,w for å fremskynde Python
  • Hvordan å installere Python på den smarte måten
  • Bedre Python prosjektledelse med Poesi
  • Virtualenv og venv: Python virtuelle miljøer forklart
  • Python virtualenv og venv do ‘s og don’ ts
  • Python-threading og subprocesses forklart
  • Hvordan å bruke Python debugger
  • Hvordan å bruke timeit å profil Python-kode
  • Hvordan å bruke cProfile å profil Python-kode
  • Komme i gang med asynkron i Python
  • Hvordan bruke asyncio i Python
  • Hvordan å konvertere Python til JavaScript (og tilbake igjen)