Python, výkonný a všestranný, postrádá několik klíčových funkcí po vybalení z krabice. Pro jednoho Python neposkytuje žádný nativní mechanismus pro kompilaci programu Python do samostatného spustitelného balíčku.

abych byl spravedlivý, původní případ použití pro Python nikdy nevyžadoval samostatné balíčky. Programy Python byly z velké části spuštěny na místě v systémech, kde žila kopie tlumočníka Pythonu. Rostoucí popularita Pythonu však vytvořila větší poptávku po spuštění aplikací Python v systémech bez nainstalovaného běhu Pythonu.,

několik třetích stran vyvinulo řešení pro nasazení samostatných aplikací Python. Nejoblíbenějším řešením parta a nejzralejší je PyInstaller. PyInstaller neznamená, že proces balení Python aplikace jít zcela bezbolestné, ale to jde dlouhou cestu tam.

V tomto článku se budeme zkoumat základy pomocí PyInstaller včetně toho, jak PyInstaller funguje, jak používat PyInstaller vytvořit samostatný Python spustitelný, jak optimalizovat Python spustitelné soubory, které vytvoříte, a jak se vyhnout některé běžné nástrahy, které s pomocí PyInstaller.,

Vytváření PyInstaller balení

PyInstaller je Python balíček, instalované pomocí pip (pip install pyinstaller). PyInstaller lze nainstalovat do výchozí instalace Pythonu, ale je nejlepší vytvořit virtuální prostředí pro projekt, který chcete zabalit a nainstalovat tam PyInstaller.

PyInstaller pracuje tím, že čte vaše Python programu, analýza všech dovozů to dělá, a svazování kopie těchto dovozů se svým programem. PyInstaller čte ve svém programu od svého vstupního bodu., Pokud je například vstupní bod vašeho programu myapp.py, spustítepyinstaller myapp.py pro provedení analýzy. PyInstaller dokáže detekovat a automaticky balíčku mnoho společných Python balíčky, jako NumPy, ale možná budete muset poskytnout tipy v některých případech. (Více o tom později.)

po analýze kódu a objevení všech knihoven a modulů, které používá, pak PyInstaller vygeneruje „spec soubor.“Python skript s příponou .spec, tento soubor obsahuje podrobnosti o tom, jak vaše Python aplikace musí být zabaleny., Při prvním spuštění PyInstaller na vaší aplikace, PyInstaller bude generovat soubor s příponou spec od nuly a naplňte ji s nějakou normální výchozí hodnoty. Nevyhazujte tento soubor; je to klíč k rafinaci nasazení PyInstaller!

nakonec se PyInstaller pokusí vytvořit spustitelný soubor z aplikace, který je dodáván se všemi jeho závislostmi. Po dokončení se v adresáři projektu objeví podsložka s názvem dist (ve výchozím nastavení můžete zadat jiný název)., To zase obsahuje adresář, který je váš svázaný app-to má.exe soubor ke spuštění, spolu se všemi knihovnami a dalších doplňkových souborů požadovaných.

vše, co musíte udělat pro distribuci vašeho programu, je balíček do tohoto adresáře jako .zip soubor nebo nějaký jiný svazek. Balíček bude obvykle třeba extrahovat v adresáři, kde má uživatel oprávnění k zápisu, aby mohl běžet.

IDG

a .spec soubor se používá k vytvoření spustitelný soubor s PyInstaller., Všimněte si jmenných prostorů uvedených v excludes. Ty budou vynechány z vytvořeného svazku, aby se ušetřilo místo.

Testování PyInstaller balení

Tam je reálná šance, že vaše první pokus o použití PyInstaller k balíčku aplikace nebude zcela úspěšný.

zkontrolujte, zda vaše PyInstaller balíček funguje, přejděte do adresáře, který obsahuje přiložený spustitelný a spustit .exe soubor z příkazového řádku., Pokud se nepodaří spustit, chyby, které uvidíte vytištěné na příkazovém řádku, by měly poskytnout nápovědu o tom, co se děje.

nejčastějším důvodem selhání balíčku PyInstaller je to, že PyInstaller nedokázal spojit požadovaný soubor. Tyto chybějící soubory spadají do několika kategorií:

  • Skryté nebo chybí dovoz: Někdy PyInstaller nemůže detekovat dovoz obalu nebo v knihovně, obvykle proto, že to je dovezené dynamicky. Balíček nebo knihovna bude muset být zadána ručně.,
  • Chybí samostatné soubory: Pokud program závisí na externích datových souborů, které musí být dodáván spolu s programem, PyInstaller má žádný způsob, jak zjistit. Budete muset ručně zahrnout soubory.
  • chybějící binární soubory: zde znovu, pokud váš program závisí na externím binárním souboru jako a .DLL, že PyInstaller nemůže detekovat, budete muset ručně zahrnout.

dobrou zprávou je, že PyInstaller poskytuje snadný způsob, jak se vypořádat s výše uvedenými problémy., .spec soubor vytvořený PyInstaller obsahuje pole můžeme vyplnit poskytnout detaily, které PyInstaller minul.

otevřete soubor .spec v textovém editoru a vyhledejte definici objektu Analysis. Některé parametry předané Analysis jsou prázdné seznamy, ale mohou být upraveny, aby zadat chybějící údaje:

  • hiddenimports skryté nebo chybí dovoz: Přidat do tohoto seznamu jeden nebo více řetězců s názvy knihoven, který chcete zahrnout s aplikací., Pokud byste chtěli přidat pandas bokeh, například, měli byste zadat jako . Všimněte si, že dotyčné knihovny musí být nainstalovány ve stejné instanci Pythonu, kde používáte PyInstaller.
  • datas pro chybějící samostatné soubory: Přidat jeden nebo více specifikace pro soubory ve stromu projektu, které chcete zahrnout s vaším projektem., Každý soubor musí být předán jako Tice označující relativní cestu k souboru v adresáři projektu a relativní cestu v distribučním adresáři, kam chcete soubor umístit. Například, pokud jste měli soubor ./models/mainmodel.dat, které jste chtěli zahrnout do vaší aplikace, a chcete jej umístit do odpovídající podadresář v distribuční adresář, měli byste použít ('./models/mainmodel.dat','./models') jako jedna položka v hiddenimports seznam. Všimněte si, že můžete použítglob-styl zástupné znaky určit více než jeden soubor.,
  • binaries pro chybějící samostatné binárky: Jako s datas můžete použít binaries projít seznam n-tic, které specifikují umístění binární soubory ve stromu projektu a jejich cíle v distribučních firem. Opět můžete použítglob-styl zástupné znaky.

Mějte na paměti, že žádný seznam předán do Analysis může být programově vytvořené dříve v .spec soubor., Koneckonců, soubor .spec je jen Python skript jiným jménem.

po provedení změn v souboru .spec znovu spusťte PyInstaller a obnovte balíček. Od této chvíle však nezapomeňte jako parametr předat upravený soubor .spec (např. pyinstaller myapp.spec). Otestujte spustitelný soubor jako dříve. Pokud je něco stále rozbité, můžete znovu upravit soubor .spec a proces opakovat, dokud vše nefunguje.,

Nakonec, když jste spokojeni, vše funguje jak má, možná budete chtít upravit .spec souboru, aby se zabránilo váš balené aplikace z prezentace příkazového řádku okna při spuštění. V EXE nastavení objektu v souboru .spec nastavte console=False. Potlačení konzoly je užitečné, pokud má vaše aplikace GUI a nechcete, aby falešné okno příkazového řádku vedlo uživatele na scestí. Toto nastavení samozřejmě neměňte, pokud vaše aplikace vyžaduje příkazový řádek.,

Rafinace PyInstaller balení

Jakmile budete mít vaše aplikace je dodáván s PyInstaller a běží správně, další věc, kterou budete pravděpodobně chtít udělat, je zúžit málo. PyInstaller balíčky nejsou známy pro bytí svelte.

protože Python je dynamický jazyk, je obtížné předpovědět, co bude v běhu daného programu potřeba. Z tohoto důvodu, když PyInstaller detekuje import balíků, obsahuje vše v tomto balíčku, ať už je ve skutečnosti používán za běhu vašeho programu.

zde je dobrá zpráva., PyInstaller obsahuje mechanismus pro selektivní vyloučení celých balíčků nebo jednotlivých jmenných prostorů v balíčcích. Například, řekněme, že váš program importuje balíček foo, který obsahuje foo.bar foo.bip. Pokud víte, že váš program používá pouze logiku v foo.bar, můžete bezpečně vyloučit foo.bip a ušetřit nějaký prostor.

k tomu použijte parametrexcludes předaný objektuAnalysis v souboru.spec., Můžete předat seznam jmen-moduly nejvyšší úrovně nebo tečkované jmenné prostory — vyloučit z balíčku. Chcete-li například vyloučit foo.bip, jednoduše zadejte .

IDG

výstup adresáře vytvořené PyInstaller. Z důvodu velkého počtu souborů v adresáři, třetí strany instalační projekt jako NSIS může být použit k zabalit adresář, do samorozbalovacího archivu, a automaticky vytvořit zástupce ke spustitelnému souboru.,

Jedno společné vyloučení, které můžete udělat, je tkinter, Python knihovna pro vytváření jednoduchých cross-platform grafické uživatelské rozhraní. Ve výchozím nastavení je tkinter a všechny jeho podpůrné soubory jsou baleny s projektem PyInstaller. Pokud ve svém projektu nepoužíváte tkinter, můžete jej vyloučit přidáním 'tkinter' do seznamu excludes. Vynechání tkinter zmenší velikost balíčku přibližně o 7 MB.

dalším běžným vyloučením jsou testovací sady., Pokud má balíček, který váš program importuje, testovací sadu, může být součástí balíčku PyInstaller. Pokud ve svém nasazeném programu skutečně nespustíte testovací sadu, můžete ji bezpečně vyloučit.

mějte na paměti, že balíčky vytvořené pomocí vyloučení by měly být před použitím důkladně testovány. Pokud skončíte s vyloučením funkce, která se používá v nějakém budoucím scénáři, který jste neočekávali, vaše aplikace se zlomí.

Tipy pro PyInstaller

  • Vytvořte si balíček PyInstaller na operačním systému, který chcete nasadit., PyInstaller nepodporuje sestavení napříč platformami. Pokud potřebujete nasadit samostatnou aplikaci Python v systémech MacOS, Linux a Windows, budete muset nainstalovat PyInstaller a vytvořit samostatné verze aplikace na každém z těchto operačních systémů.
  • Sestavte si svůj balíček PyInstaller, jak si vytvořit aplikaci. Jakmile víte, že budete nasazení vašeho projektu s PyInstaller, budovat své .spec soubor a začít rafinace PyInstaller balíček souběžně s vývojem aplikace., Tímto způsobem můžete přidávat vyloučení nebo inkluze, jak jdete, a vyzkoušet způsob, jakým jsou nové funkce nasazeny s aplikací, jak je píšete.
  • nepoužívejte režim PyInstaller--onefile. PyInstaller obsahuje přepínač příkazového řádku, --onefile, který zabalí celou aplikaci do jediného samorozbalovacího spustitelného souboru. Zní to jako skvělý nápad-stačí dodat pouze jeden soubor! – ale má to svá úskalí. Kdykoli spustíte aplikaci, musí nejprve rozbalit všechny soubory ve spustitelném souboru do dočasného adresáře., Pokud je aplikace velká (například 200 MB), rozbalení může znamenat zpoždění několika sekund. Místo toho použijte výchozí režim jednoho adresáře a vše zabalte jako soubor .zip.
  • Vytvořte instalační program pro aplikaci PyInstaller. Pokud chcete nějaký způsob, jak nasadit jinou aplikaci než a .zip soubor, zvažte použití instalačního nástroje, jako je open source Nullsoft Scriptable Install System. To přidává velmi malou režii na velikost dodávky a umožňuje konfigurovat mnoho aspektů procesu instalace, jako je vytvoření zástupce spustitelného souboru.,
  • neočekávejte zrychlení. PyInstaller je obalový systém, nikoli kompilátor nebo optimalizátor. Kód zabalený s PyInstaller neběží rychleji, než by při spuštění na původním systému. Pokud chcete urychlit kód Pythonu, použijte knihovnu C-accelerated, která je vhodná pro daný úkol, nebo projekt jako Cython.,w k urychlení Python
  • Jak nainstalovat Python chytrý způsob,
  • Lepší Python řízení projektu s Poezií
  • Virtualenv a venv: Python virtuálních prostředích vysvětlil,
  • Python virtualenv a venv dělat a co nedělat,
  • Python podprocesů a podprocesy vysvětlil,
  • Jak používat Python debugger
  • Jak používat timeit na profil Python kódu
  • Jak používat cProfile na profil Python kódu
  • začínáme s async v Pythonu
  • Jak používat asyncio v Pythonu
  • Jak převést Python pro JavaScript (a zase zpátky)