Python, kraftfuld og alsidig som den er, mangler et par Nøglefunktioner ud af kassen. For det første giver Python ingen indbygget mekanisme til at kompilere et Python-program i en selvstændig eksekverbar pakke.

for at være retfærdig, den oprindelige use case for Python aldrig opfordret til standalone pakker. Python-programmer er stort set blevet kørt på stedet på systemer, hvor en kopi af Python-tolken boede. Men den stigende popularitet af Python har skabt større efterspørgsel efter at køre Python apps på systemer uden installeret Python runtime.,

flere tredjeparter har udviklet løsninger til implementering af enkeltstående Python-apps. Den mest populære løsning af bunken, og den mest modne, er PyInstaller. PyInstaller gør ikke processen med at pakke en Python-app til at gå helt smertefri, men det går langt der.

I denne artikel vil vi udforske den grundlæggende brug af PyInstaller herunder hvordan PyInstaller virker, hvordan man bruger PyInstaller til at skabe en enkeltstående Python eksekverbare, hvordan man kan finjustere Python-programmer, du opretter, og hvordan man kan undgå nogle af de mest almindelige faldgruber, der går med hjælp PyInstaller.,

Oprettelse af en PyInstaller pakke

PyInstaller er en Python-pakke, der er installeret med pip (pip install pyinstaller). PyInstaller kan installeres i din standard Python-installation, men det er bedst at oprette et virtuelt miljø til det projekt, du vil pakke og installere PyInstaller der.

PyInstaller virker ved at læse dit Python program, analysere alle de Import det gør, og bundling kopier af denne import med dit program. PyInstaller læser i dit program fra dets indgangspunkt., For eksempel, hvis dit programs indgangspunkt er myapp.py, vil du køre pyinstaller myapp.py for at udføre analysen. PyInstaller kan registrere og automatisk pakke mange almindelige Python-pakker, som NumPy, men du skal muligvis give tip i nogle tilfælde. (Mere om dette senere.efter at have analyseret din kode og opdaget alle de biblioteker og moduler, den bruger, genererer PyInstaller derefter en “spec-fil.”En Python script med udvidelsen .spec, denne fil indeholder oplysninger om, hvordan din Python app skal pakkes op., Første gang du kører PyInstaller på din app, vil PyInstaller generere en spec-fil fra bunden og udfylde det med nogle fornuftige standardindstillinger. Kass thisr ikke denne fil; det er nøglen til at raffinere en pyinstaller-implementering!

endelig forsøger PyInstaller at producere en eksekverbar fra appen, bundtet med alle dens afhængigheder. Når den er færdig, vises en undermappe med navnet dist (som standard; du kan frit angive et andet navn) i projektmappen., Dette indeholder igen en mappe — der er din medfølgende app – den har en .exe fil, der skal køres, sammen med alle biblioteker og andre supplerende filer, der kræves.

alt hvad du skal gøre for at distribuere dit program, er at pakke denne mappe op som en .zip fil eller et andet bundt. Bundtet skal typisk udvindes i en mappe, hvor brugeren har skrivetilladelser for at kunne køre.

IDG

En .spec-fil bruges til at oprette en eksekverbar med PyInstaller., Bemærk de navnerum, der er anført i excludes. Disse vil blive udeladt af den oprettede bundle for at spare plads.

Test af en PyInstaller pakke

Der er en rimelig chance for at dit første forsøg på at bruge PyInstaller til at pakke en app ikke vil være helt vellykket.

for at kontrollere, om din PyInstaller-pakke fungerer, skal du navigere til det bibliotek, der indeholder den medfølgende eksekverbare og køre .exe fil der fra kommandolinjen., Hvis det ikke kører, skal de fejl, du vil se trykt på kommandolinjen, give et tip om, hvad der er galt.

den mest almindelige årsag til, at en PyInstaller-pakke mislykkes, er, at PyInstaller ikke kunne samle en påkrævet Fil. Sådanne manglende filer falder i nogle få kategorier:

  • skjult eller manglende import: nogle gange kan PyInstaller ikke registrere importen af en pakke eller et bibliotek, typisk fordi den importeres dynamisk. Pakken eller biblioteket skal angives manuelt.,hvis programmet afhænger af eksterne datafiler, der skal bundtes med programmet, har PyInstaller ingen mulighed for at vide det. Du skal manuelt medtage filerne.
  • manglende binære filer: her igen, hvis dit program afhænger af en ekstern binær som en .DLL, som PyInstaller ikke kan registrere, skal du manuelt medtage den.

den gode nyhed er, at PyInstaller giver en nem måde at håndtere ovenstående problemer på., .spec fil oprettet af PyInstaller indeholder felter, vi kan udfylde for at give de detaljer, som PyInstaller savnede.

Åbn.specfilen i en teksteditor og kig efter definitionen afAnalysis objekt. Flere af de parametre, der er sendt til Analysis er blanke lister, men de kan redigeres for at angive manglende detaljer:

  • hiddenimports for skjulte mangler eller import: Tilføje til denne liste en eller flere strenge med navnene på de biblioteker, du vil have inkluderet med din app., Hvis du ønskede at tilføje en pandas og bokeh, for eksempel, ville du angive, at som . Bemærk, at de pågældende biblioteker skal installeres i samme forekomst af Python, hvor du kører PyInstaller.
  • datas for manglende enkeltstående filer: Tilføj her en eller flere specifikationer for filer i dit projekttræ, som du vil medtage i dit projekt., Hver fil skal sendes som en tupel, der angiver den relative sti til filen i dit projektmappe og den relative sti i distributionsmappen, hvor du vil placere filen. For eksempel, hvis du havde en fil ./models/mainmodel.dat at du ønsker at inkludere i din app, og du ønsker at placere det i en matchende undermappe i din distribution bibliotek, du vil bruge ('./models/mainmodel.dat','./models') som en post i hiddenimports liste. Bemærk, at du kan bruge glob-style wildildcards til at angive mere end filen fil.,
  • binaries for manglende standalone binære filer: Som med datas, kan du bruge binaries til at bestå af en liste af tupler, der angiver placeringen af binære filer i projekttræet og deres omgivelser i distribution bibliotek. Igen kan du bruge glob-stil jokertegn.

huske, at nogen af de lister, der gik til Analysis kan være programmering genereret tidligere i .spec fil., Når alt kommer til alt er .spec – filen bare et Python-script med et andet navn.

Når du har foretaget ændringer i .spec filen, skal du køre PyInstaller igen for at genopbygge pakken. Fra nu af skal du dog sørge for at videregive den ændrede .spec fil som parameter (f.eks. pyinstaller myapp.spec). Test den eksekverbare som før. Hvis noget stadig er brudt, kan du redigere .spec filen og gentage processen, indtil alt fungerer.,

endelig, når du er tilfreds, fungerer alt efter hensigten, kan du redigere .spec fil for at forhindre, at din pakkede app præsenterer et kommandolinjevindue, når den lanceres. IEXE Objektindstillinger i .spec fil, Indstil console=False. Det er nyttigt at undertrykke konsollen, hvis din app har en GUI, og du ikke ønsker et falsk kommandolinjevindue, der fører brugere på afveje. Selvfølgelig skal du ikke ændre denne indstilling, hvis din app kræver en kommandolinje.,

raffinering af en PyInstaller-pakke

Når du har din app pakket med PyInstaller og kører korrekt, er den næste ting, du sandsynligvis vil gøre, at slanke den lidt ned. PyInstaller pakker er ikke kendt for at være svelte.da Python er et dynamisk sprog, er det svært at forudsige, hvad der skal bruges ved runtime af et givet program. Af den grund, når PyInstaller registrerer en pakkeimport, indeholder den alt i den pakke, uanset om den faktisk bruges ved kørsel af dit program.

Her er de gode nyheder., PyInstaller indeholder en mekanisme til selektivt at udelukke hele pakker, eller individuelle navnerum inden pakker. For eksempel, lad os sige, at dit program import pakke foo, der indeholder foo.bar og foo.bip. Hvis du ved, at dit program kun bruger logik i foo.bar, kan du med sikkerhed udelukke foo.bip og spare lidt plads.

for at gøre dette bruger du excludesparameteren overført til Analysisobjektet i .spec filen., Du kan bestå en liste over navne-moduler på øverste niveau eller stiplede navnerum – for at ekskludere fra din pakke. For eksempel at udelukke foo.bip, vil du blot angive .

IDG

den leverbare mappe oprettet af PyInstaller. På grund af det store antal filer i mappen, kan et tredjepartsinstallationsprojekt som NSIS bruges til at pakke mappen op i et selvudpakkende arkiv og automatisk oprette en genvej til den eksekverbare.,

en almindelig udelukkelse, du kan lave, er tkinter, Python-biblioteket til oprettelse af enkle grafiske brugergrænseflader på tværs af platforme. Som standard er tkinter og alle dens supportfiler pakket med et PyInstaller-projekt. Hvis du ikke bruger tkinter i dit projekt, kan du udelukke det ved at tilføje 'tkinter' til excludes liste. Udelade tkinter vil reducere størrelsen af pakken med omkring 7 MB.

en anden almindelig udelukkelse er testsuiter., Hvis en pakke, som dit program importerer, har en testsuite, kan testsuiten ende med at blive inkluderet i din PyInstaller-pakke. Medmindre du rent faktisk kører testpakken i dit implementerede program, kan du med sikkerhed udelukke det.

Husk, at pakker, der er oprettet ved hjælp af udelukkelser, skal testes grundigt, før de bruges. Hvis du ender med at udelukke funktionalitet, der bruges i et fremtidigt scenario, som du ikke forventede, vil din app gå i stykker.

PyInstaller tips

  • Byg din PyInstaller-pakke på det operativsystem, du planlægger at installere på., PyInstaller understøtter ikke cross-platform bygger. Hvis du har brug for at installere din enkeltstående Python-app på MacOS -, Linu. – og .indo .s-systemer, skal du installere PyInstaller og opbygge separate versioner af appen på hvert af disse operativsystemer.
  • Byg din PyInstaller-pakke, når du udvikler din app. Så snart du ved, at du vil implementere dit projekt med PyInstaller, skal du opbygge din .spec fil og begynde at forfine PyInstaller-pakken parallelt med udviklingen af din app., På denne måde kan du tilføje undtagelser eller indeslutninger, mens du går, og teste den måde, nye funktioner implementeres med appen, mens du skriver dem.
  • brug ikke PyInstaller ‘ s --onefile – tilstand. PyInstaller omfatter en kommandolinjeparameter, --onefile, der pakker hele din app til en enkelt selvudpakkende eksekverbar fil. Det lyder som en rigtig god id! — du behøver kun at levere !n fil! – men den har nogle faldgruber. Når du kører appen, skal den først pakke alle filerne i den eksekverbare til en midlertidig mappe., Hvis appen er stor (200MB, for eksempel), kan udpakning betyde en forsinkelse på flere sekunder. Brug Standard Single-directory mode i stedet, og pakk bare alt sammen som en .zip fil.
  • Opret et installationsprogram til din PyInstaller-app. Hvis du vil have en måde at implementere din anden app end en .considerip-fil, overvej at bruge et installationsprogram som open source Nullsoft Scriptable Install System. Det tilføjer meget lidt overhead til størrelsen af den leverbare og lader dig konfigurere mange aspekter af installationsprocessen, som at skabe genveje til din eksekverbare.,
  • forvent ikke speedups. PyInstaller er et emballagesystem, ikke en compiler eller en optimi .er. Kode pakket med PyInstaller kører ikke hurtigere end det ville, når køre på det oprindelige system. Hvis du vil fremskynde Python-kode, skal du bruge et c-accelereret bibliotek, der passer til opgaven, eller et projekt som Cython.,w til at fremskynde Python
  • Hvordan til at installere Python smart måde
  • Bedre Python projektledelse med Poesi
  • Virtualenv og venv: Python virtuelle miljøer forklaret
  • Python virtualenv og venv do ‘s og don’ ts
  • Python-threading og subprocesses forklaret
  • Hvordan til at bruge Python debugger
  • Hvordan man bruger timeit til profil Python-kode
  • Hvordan man bruger cProfile til profil Python-kode
  • Komme i gang med async i Python
  • Hvordan man bruger asyncio i Python
  • Hvordan til at konvertere Python til at JavaScript (og tilbage igen)