Python, kraftfull och mångsidig som den är, saknar några viktiga funktioner ur lådan. För en, Python ger ingen infödd mekanism för att sammanställa ett Python-program i ett fristående körbart paket.

för att vara rättvis krävde det ursprungliga användningsfallet för Python aldrig fristående paket. Python-program har i stort sett körts på plats på system där en kopia av Python-tolken bodde. Men den stigande populariteten hos Python har skapat större efterfrågan på att köra Python-appar på system utan installerad Python runtime.,

flera tredje parter har konstruerat lösningar för att distribuera fristående Python-appar. Den mest populära lösningen av gänget, och den mest mogna, är PyInstaller. PyInstaller gör inte processen att packa en Python-app för att gå helt smärtfritt, men det går långt där.

I den här artikeln ska vi utforska grunderna i att använda PyInstaller inklusive hur PyInstaller fungerar, hur man använder PyInstaller för att skapa en fristående Python körbar, så att finjustera Python-filer du skapar och hur man kan undvika några av de vanligaste fallgroparna som går med hjälp av PyInstaller.,

skapa ett PyInstaller-paket

PyInstaller är ett Python-paket, installerat medpip (pip install pyinstaller). PyInstaller kan installeras i din standard Python installation, men det är bäst att skapa en virtuell miljö för projektet som du vill paketera och installera PyInstaller det.

PyInstaller fungerar genom att läsa ditt Python-program, analysera all import den gör och bunta kopior av dessa Importer med ditt program. PyInstaller läser i ditt program från dess ingångspunkt., Till exempel, om programmets ingångspunkt är myapp.py, skulle du köra pyinstaller myapp.py för att utföra analysen. PyInstaller kan upptäcka och automatiskt paketera många vanliga Python-paket, som NumPy, men du kan behöva ge tips i vissa fall. (Mer om detta senare.)

Efter att ha analyserat din kod och upptäckt alla bibliotek och moduler som den använder, genererar PyInstaller sedan en ”spec-fil.”Ett Python-skript med tillägget .spec, innehåller den här filen detaljer om hur din Python-app behöver packas upp., Första gången du kör PyInstaller på din app, PyInstaller kommer att generera en spec-fil från grunden och fylla den med några vettiga standardvärden. Kassera inte den här filen; det är nyckeln till att förfina en PyInstaller-distribution!

slutligen försöker PyInstaller att producera en körbar från appen, buntad med alla dess beroenden. När den är klar visas en undermapp som heter dist (som standard; du är fri att ange ett annat namn) i projektkatalogen., Detta i sin tur innehåller en katalog som är din medföljande app – Den har en.exe fil att köra, tillsammans med alla bibliotek och andra kompletterande filer som krävs.

allt du behöver göra för att distribuera ditt program, då, är Paket upp denna katalog som en.zip fil eller någon annan bunt. Paketet behöver vanligtvis extraheras i en katalog där användaren har skrivbehörigheter för att kunna köras.

IDG

a .spec-fil används för att skapa en körbar med PyInstaller., Notera de namnområden som anges i excludes. Dessa kommer att lämnas ut ur det skapade buntet för att spara utrymme.

testa ett PyInstaller-paket

det finns en rimlig chans att ditt första försök att använda PyInstaller för att paketera en app inte kommer att bli helt framgångsrik.

för att kontrollera om ditt PyInstaller-paket fungerar, navigera till katalogen som innehåller den medföljande körbara filen och kör filen.exe där från kommandoraden., Om det inte går att köra, bör de fel som du ser skrivs ut till kommandoraden ge en ledtråd om vad som är fel.

den vanligaste orsaken till att ett PyInstaller-paket misslyckas är att PyInstaller misslyckades med att bunta ihop en nödvändig fil. Sådana saknade filer faller i några kategorier:

  • dold eller saknad import: ibland kan PyInstaller inte upptäcka importen av ett paket eller ett bibliotek, vanligtvis eftersom det importeras dynamiskt. Paketet eller biblioteket måste anges manuellt.,
  • saknas fristående filer:Om programmet beror på externa datafiler som måste paketeras med programmet, PyInstaller har inget sätt att veta. Du måste manuellt inkludera filerna.
  • saknade binärer: här igen, om ditt program beror på en extern binär som en .DLL som PyInstaller inte kan upptäcka måste du manuellt inkludera den.

den goda nyheten är att PyInstaller ger ett enkelt sätt att hantera ovanstående problem., Filen.spec som skapats av PyInstaller innehåller fält som vi kan fylla i för att ge de detaljer som PyInstaller missade.

öppna filen.spec I en textredigerare och leta efter definitionen av objektetAnalysis. Flera av de parametrar som skickas tillAnalysis är tomma listor, men de kan redigeras för att ange de saknade detaljerna:

  • hiddenimports för dold eller saknad import: Lägg till en eller flera strängar i listan med namnen på de bibliotek du vill ha med din app., Om du vill lägga till pandas och bokeh, till exempel, skulle du ange det som . Observera att biblioteken i fråga måste installeras i samma instans av Python där du kör PyInstaller.
  • datas för saknade fristående filer: Lägg till här en eller flera specifikationer för filer i ditt projektträd som du vill inkludera med ditt projekt., Varje fil måste skickas som en tupel som anger den relativa sökvägen till filen i projektkatalogen och den relativa sökvägen i distributionskatalogen där du vill placera filen. Om du till exempel hade en fil ./models/mainmodel.dat som du ville inkludera med din app och du vill placera den i en matchande underkatalog i distributionskatalogen skulle du använda ('./models/mainmodel.dat','./models') som en post i listan hiddenimports. Observera att du kan användaglob-stil jokertecken för att ange mer än en fil.,
  • binariesför saknade fristående binärer: som meddataskan du användabinaries för att skicka en lista med tuples som anger binärplatserna i projektträdet och deras destinationer i distributionskatalogen. Återigen kan du användaglob-stil jokertecken.

tänk på att någon av listorna som skickas tillAnalysis kan genereras programmatiskt tidigare i filen.spec., När allt kommer omkring är filen.spec bara ett Python-skript med ett annat namn.

När du har gjort ändringar i filen.spec, rerun PyInstaller för att återskapa paketet. Men från och med nu, var noga med att skicka den modifierade filen .spec som parametern (t.ex. pyinstaller myapp.spec). Testa den körbara som tidigare. Om något fortfarande är trasigt kan du redigera filen .spec och upprepa processen tills allt fungerar.,

slutligen, när du är nöjd fungerar allt som avsett, kanske du vill redigera filen.spec för att förhindra att din paketerade app presenterar ett kommandoradsfönster när den startas. I objektinställningarna EXE I filen .spec ställer du in console=False. Att undertrycka konsolen är användbar om din app har ett GUI och du inte vill ha en falsk kommandoradsfönster Ledande användare vilse. Ändra naturligtvis inte den här inställningen om din app kräver en kommandorad.,

raffinering av ett PyInstaller-paket

När du har din app förpackad med PyInstaller och körs ordentligt, är nästa sak du sannolikt vill göra smal ner det lite. PyInstaller paket är inte kända för att vara svelte.

eftersom Python är ett dynamiskt språk är det svårt att förutsäga precis vad som behövs vid körning av ett visst program. Av den anledningen, när PyInstaller upptäcker ett paket import, den innehåller allt i det paketet, oavsett om det faktiskt används vid körning av ditt program.

här är de goda nyheterna., PyInstaller innehåller en mekanism för att selektivt utesluta hela paket, eller enskilda namnområden inom paket. Låt oss till exempel säga att ditt program importerar paket foo, vilket inkluderar foo.bar och foo.bip. Om du vet att ditt program bara använder logik i foo.barkan du säkert uteslutafoo.bip och spara lite utrymme.

för att göra detta använder du parametern excludessom skickas till objektet AnalysisI filen .spec., Du kan skicka en lista med namn-moduler på toppnivå eller prickade namnområden — för att utesluta från ditt paket. Till exempel, för att utesluta foo.bip, skulle du helt enkelt ange .

IDG

den levererbara katalog som skapats av PyInstaller. På grund av det stora antalet filer i katalogen kan ett tredjepartsinstallationsprojekt som NSIS användas för att packa upp katalogen i ett självuppackande arkiv och automatiskt skapa en genväg till den körbara.,

en vanlig uteslutning du kan göra ärtkinter, Python-biblioteket för att skapa enkla grafiska användargränssnitt över plattformen. Som standard ärtkinter och alla dess supportfiler packade med ett PyInstaller-projekt. Om du inte använder tkinter I ditt projekt kan du utesluta det genom att lägga till 'tkinter' I listan excludes. Om du utelämnar tkinter minskar paketets storlek med cirka 7 MB.

en annan vanlig uteslutning är testsviter., Om ett paket din programimport har en testsvit kan testsviten hamna i ditt PyInstaller-paket. Om du inte faktiskt kör testsviten i ditt distribuerade program kan du säkert utesluta det.

Tänk på att paket som skapats med undantag bör testas noggrant innan de används. Om du slutar utesluta funktionalitet som används i något framtida scenario som du inte förutsåg, kommer din app att bryta.

PyInstaller tips

  • Bygg ditt PyInstaller-paket på operativsystemet du planerar att distribuera på., PyInstaller stöder inte plattformsoberoende bygger. Om du behöver distribuera din fristående Python-app på MacOS, Linux och Windows-system måste du installera PyInstaller och bygga separata versioner av appen på vart och ett av dessa operativsystem.
  • Bygg ditt PyInstaller-paket när du utvecklar din app. Så fort du vet att du kommer att distribuera ditt projekt med PyInstaller, bygga din.spec fil och börja förfina PyInstaller paketet parallellt med utvecklingen av din app., På så sätt kan du lägga till uteslutningar eller inklusioner när du går och testa hur nya funktioner distribueras med appen när du skriver dem.
  • använd inte PyInstaller ’ s--onefile – läge. PyInstaller innehåller en kommandoradsomkopplare, --onefile, som packar hela appen till en enda självuppackande körbar. Det låter som en bra idé – du behöver bara leverera en fil! – men den har några fallgropar. När du kör appen måste den först packa upp alla filer i den körbara till en tillfällig katalog., Om appen är stor (till exempel 200MB) kan uppackning innebära en fördröjning på flera sekunder. Använd standard single-directory mode istället, och bara packa upp allt som en.zip fil.
  • Skapa ett installationsprogram för din PyInstaller app. Om du vill ha något sätt att distribuera din app annat än en .zip-fil, överväga att använda ett installationsverktyg som open source Nullsoft Scriptable Install System. Det lägger mycket lite overhead till storleken på leverans och låter dig konfigurera många aspekter av installationsprocessen, som att skapa genvägar till din körbara.,
  • förvänta dig inte speedups. PyInstaller är ett förpackningssystem, inte en kompilator eller en optimizer. Kod förpackad med PyInstaller körs inte snabbare än den skulle när den körs på det ursprungliga systemet. Om du vill påskynda Python-kod, Använd ett C-accelererat bibliotek som passar uppgiften, eller ett projekt som Cython.,W för att påskynda Python
  • hur man installerar Python det smarta sättet
  • bättre Python Projektledning med poesi
  • Virtualenv och venv: Python virtuella miljöer förklaras
  • Python virtualenv och venv do ’s och don’ ts
  • Python threading och subprocesses förklaras
  • hur man använder Python debugger
  • hur man använder timeit till profil Python kod
  • hur man använder cprofile för att profilera Python-kod
  • komma igång med async i Python
  • hur man använder asyncio i Python
  • hur man konverterar Python till JavaScript (och tillbaka igen)