Programování

Jak používat PyInstaller k vytvoření spustitelných souborů Pythonu

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

Abychom byli spravedliví, původní případ použití pro Python nikdy nevyžadoval samostatné balíčky. Programy Pythonu byly obecně spuštěny na místě v systémech, kde žila kopie interpreta Pythonu. Zvyšující se popularita Pythonu však vyvolala větší poptávku po spouštění aplikací Pythonu v systémech bez nainstalovaného běhového prostředí Pythonu.

Několik třetích stran vytvořilo řešení pro nasazení samostatných aplikací v Pythonu. Nejpopulárnějším a nejzralejším řešením partie je PyInstaller. PyInstaller nedělá proces balení aplikace Pythonu úplně bezbolestným, ale jde tam dlouhou cestou.

V tomto článku prozkoumáme základy používání PyInstalleru, včetně toho, jak PyInstaller funguje, jak pomocí PyInstalleru vytvořit samostatný spustitelný soubor Pythonu, jak doladit vámi vytvořené spustitelné soubory Pythonu a jak se vyhnout některým běžným nástrahám, které jdou s použitím PyInstaller.

Vytváření balíčku PyInstaller

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

PyInstaller pracuje tak, že čte váš program v Pythonu, analyzuje všechny importy, které provádí, a svazuje kopie těchto importů s vaším programem. PyInstaller načte váš program z jeho vstupního bodu. Například pokud je vstupní bod vašeho programu myapp.py, utekli byste pyinstaller myapp.py provést analýzu. PyInstaller dokáže detekovat a automaticky zabalit mnoho běžných balíčků Pythonu, například NumPy, ale v některých případech možná budete muset poskytnout nápovědu. (Více o tom později.)

Po analýze vašeho kódu a objevení všech knihoven a modulů, které používá, PyInstaller poté vygeneruje „soubor spec“. Skript v Pythonu s příponou .spec, tento soubor obsahuje podrobnosti o tom, jak je třeba zabalit vaši aplikaci v Pythonu. Při prvním spuštění PyInstaller ve vaší aplikaci PyInstaller vygeneruje od začátku soubor spec a naplní jej některými rozumnými výchozími hodnotami. Nezahazujte tento soubor; je to klíč k zdokonalení nasazení PyInstaller!

Nakonec se PyInstaller pokusí vytvořit spustitelný soubor z aplikace, se všemi jeho závislostmi. Po dokončení pojmenovaná podsložka dist (ve výchozím nastavení; můžete zadat jiný název) se zobrazí v adresáři projektu. To zase obsahuje adresář, který je vaší dodávanou aplikací - má .exe soubor, který se má spustit, spolu se všemi požadovanými knihovnami a dalšími doplňkovými soubory.

Vše, co musíte udělat pro distribuci vašeho programu, je zabalit tento adresář jako .zip soubor nebo jiný svazek. Balíček bude obvykle nutné extrahovat do adresáře, kde má uživatel oprávnění k zápisu, aby mohl být spuštěn.

Testování balíčku PyInstaller

Existuje reálná šance, že váš první pokus o použití aplikace PyInstaller k zabalení aplikace nebude zcela úspěšný.

Chcete-li zkontrolovat, zda váš balíček PyInstaller funguje, přejděte do adresáře obsahujícího spustitelný soubor a spusťte .exe soubor tam z příkazového řádku. Pokud se nespustí, měly by chyby, které uvidíte vytištěné na příkazovém řádku, poskytnout nápovědu k tomu, co je špatně.

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

  • Skryté nebo chybějící importy: Někdy PyInstaller nedokáže detekovat import balíčku nebo knihovny, obvykle proto, že se importuje dynamicky. Balíček nebo knihovnu bude třeba zadat ručně.
  • Chybí samostatné soubory: Pokud program závisí na externích datových souborech, které je třeba s programem spojit, nemá PyInstaller žádnou možnost vědět. Soubory budete muset zahrnout ručně.
  • Chybějící binární soubory: Opět platí, že pokud váš program závisí na externím binárním souboru, jako je .DLL, který PyInstaller nedokáže detekovat, budete jej muset ručně zahrnout.

Dobrou zprávou je, že PyInstaller poskytuje snadný způsob řešení výše uvedených problémů. The .spec soubor vytvořený PyInstallerem obsahuje pole, která můžeme vyplnit, abychom poskytli podrobnosti, které PyInstaller zmeškal.

Otevři .spec soubor v textovém editoru a hledejte definici souboru Analýza objekt. Několik parametrů předáno Analýza jsou prázdné seznamy, ale lze je upravit a určit chybějící podrobnosti:

  • skryté importy pro skryté nebo chybějící importy: Přidejte do tohoto seznamu jeden nebo více řetězců se jmény knihoven, které chcete do své aplikace zahrnout. Pokud jste chtěli přidat pandy a bokehnapříklad byste to specifikovali jako['pandy', 'bokeh']. Všimněte si, že jde o příslušné knihovny musí být nainstalován ve stejné instanci Pythonu, kde používáte PyInstaller.
  • údaje pro chybějící samostatné soubory: Přidejte sem jednu nebo více specifikací pro soubory ve stromu projektu, které chcete zahrnout do projektu. Každý soubor musí být předán jako n-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 své aplikace a chcete ji umístit do odpovídajícího podadresáře v distribučním adresáři, použijete ('./models/mainmodel.dat','./models') jako jeden záznam v skryté importy seznam. Všimněte si, že můžete použít globZástupné znaky stylu určující více než jeden soubor.
  • binární soubory za chybějící samostatné binární soubory: Stejně jako u údaje, Můžeš použít binární soubory předat seznam n-tic, které určují umístění binárních souborů ve stromu projektu a jejich cíle v distribučním adresáři. Opět můžete použít glob- zástupné znaky stylu.

Pamatujte, že některý ze seznamů byl předán Analýza lze programově generovat dříve v .spec soubor. Koneckonců, .spec soubor je pouze skript v Pythonu pod jiným názvem.

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

Nakonec, až budete spokojeni, vše funguje podle plánu, možná budete chtít upravit.spec soubor, který zabrání tomu, aby vaše zabalená aplikace při spuštění zobrazila okno příkazového řádku. V EXE nastavení objektu v .spec soubor, souborconsole = False. Potlačení konzoly je užitečné, pokud má vaše aplikace grafické uživatelské rozhraní a nechcete rušivé okno příkazového řádku, které by uživatele svedlo z cesty. Toto nastavení samozřejmě neměňte, pokud vaše aplikace vyžaduje příkazový řádek.

Upřesnění balíčku PyInstaller

Jakmile máte svou aplikaci zabalenou v PyInstalleru a běžíte správně, další věcí, kterou pravděpodobně budete chtít udělat, je trochu ji zúžit. O balíčcích PyInstaller není známo, že jsou štíhlé.

Protože Python je dynamický jazyk, je těžké předvídat, co bude daný program za běhu potřebovat. Z tohoto důvodu, když PyInstaller detekuje import balíčku, zahrnuje všechno v tomto balíčku, ať už je skutečně používán za běhu vaším programem.

Tady jsou dobré zprávy. PyInstaller obsahuje mechanismus pro selektivní vyloučení celých balíčků nebo jednotlivců jmenné prostory v balíčcích. Řekněme například, že váš program importuje balíček foo, který zahrnuje foo.bar a foo.bip. Pokud víte, že váš program používá pouze logiku foo.bar, můžete bezpečně vyloučit foo.bip a ušetřit místo.

K tomu použijete vylučuje parametr předán do Analýza objekt v .spec soubor. Můžete předat seznam jmen - moduly nejvyšší úrovně nebo tečkované obory názvů - které chcete z balíčku vyloučit. Například vyloučit foo.bip, jednoduše zadáte['foo.bip'].

Jedno společné vyloučení, které můžete udělat, je tkinter, knihovna Python pro vytváření jednoduchých grafických uživatelských rozhraní pro různé platformy. Ve výchozím stavu,tkinter a všechny jeho podpůrné soubory jsou zabaleny v projektu PyInstaller. Pokud nepoužíváte tkinter ve svém projektu jej můžete vyloučit přidáním 'tkinter' do vylučuje seznam. Vynechávání tkinter zmenší velikost balíčku přibližně o 7 MB.

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

Pamatujte, že balíčky vytvořené pomocí výjimek by měly být před použitím důkladně otestovány. Pokud nakonec vyloučíte funkce, které se používají v budoucím scénáři, který jste nepředpokládali, aplikace se rozbije.

Tipy pro PyInstaller

  • Vytvořte si balíček PyInstaller na operačním systému, na který plánujete 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 samostatnou verzi aplikace v každém z těchto operačních systémů.
  • Sestavte si balíček PyInstaller při vývoji aplikace. Jakmile víte, že budete nasazovat svůj projekt pomocí PyInstaller, vytvořte si .spec soubor a začněte vylepšovat balíček PyInstaller souběžně s vývojem vaší aplikace. Tímto způsobem můžete přidávat vyloučení nebo zahrnutí, jak jdete, a otestovat, jak jsou nové funkce nasazeny s aplikací, jak je píšete.
  • Nepoužívejte PyInstaller--jeden soubor režimu. PyInstaller obsahuje přepínač příkazového řádku, --jeden soubor, který zabalí celou vaši aplikaci do jednoho samorozbalovacího spustitelného souboru. To zní jako skvělý nápad - musíte doručit pouze jeden soubor! - ale má to několik ú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), vybalení může znamenat zpoždění několika sekund. Místo toho použijte výchozí režim s jedním adresářem a vše zabalte jako .zip soubor.
  • Vytvořte instalační program pro vaši aplikaci PyInstaller. Pokud chcete nasadit jinou aplikaci než soubor .zip, zvažte použití instalačního nástroje, jako je open source Nullsoft Scriptable Install System. Přidává velmi malou režii k velikosti dodávaného materiálu a umožňuje vám konfigurovat mnoho aspektů instalačního procesu, například vytvářet zástupce spustitelného souboru.
  • Nečekejte zrychlení. PyInstaller je aobal systém, ne apřekladačnebooptimalizátor. Kód zabalený s PyInstallerem se nespustí rychleji, než kdyby byl spuštěn v původním systému. Pokud chcete zrychlit kód v Pythonu, použijte knihovnu s akcelerací C vhodnou pro daný úkol nebo projekt jako Cython.

Jak udělat víc s Pythonem

  • Výukový program pro Cython: Jak zrychlit Python
  • Jak chytře nainstalovat Python
  • Lepší správa projektů v Pythonu s poezií
  • Virtualenv a venv: Vysvětlení virtuálních prostředí Pythonu
  • Python virtualenv a venv dělá a nedělá
  • Vysvětlení vláken a podprocesů v Pythonu
  • Jak používat debugger Pythonu
  • Jak používat timeit k profilování kódu Pythonu
  • Jak používat cProfile k profilování kódu Pythonu
  • Začněte s asynchronizací v Pythonu
  • Jak používat asyncio v Pythonu
  • Jak převést Python na JavaScript (a zpět)