Tato přednáška pojednává o použití modulu pip
pro správu nesystémových knihoven v Python'u. Ač se jedná o externí program, od Python'u 3.4 (a 2.7.9) je při instalaci (nevyberete-li si jinak) automaticky zaveden. Dlužno podotknout, že je to v historii Python'u zřejmě první balíčkovací systém, který je skutečně použitelný.
PS: Pro obecný úvod o knihovnách si prostudejte nejdříve příslušnou přednášku o knihovnách a o modulech.
Než se ponoříme do detailů, důležitá poznámka o nápovědě:
PS: Zkrácené varianty s -h fungují samozřejmě také.
Výpis všech nainstalovaných balíčků vám vrátí příkaz:
Jeho výstup je přitom možno upravovat dodatečnými parametry, mezi nejdůležitější patří:
-o, --outdated
– vypíše balíčky, pro které je k dispozici novější verze;
-u, --uptodate
– vypíše balíčky, které jsou v poslední dostupné verzi;
-l, --local
– při spuštění ve virtuálním prostředí vynechá z výpisu balíčky z globálního adresáře a vypíše pouze lokální.
Podrobnější informace o konkrétním nainstalovaném balíčku (např. jeho umístění na souborovém systému či závislosti na jiných balíčcích) získáte dotazem:
Ve výchozím nastavení nainstalujete balíček příslušného jména v poslední verzi z hostovací služby PyPI (Python Package Index) příkazem:
Balíček bude takto nainstalován do příslušného globálního adresáře site-packages (pokud nejste zrovna ve virtuálním prostředí, pak skončí tam), a to včetně všech svých případných závislostí.
Na instalaci do tohoto globálního adresáře ovšem jednak nemusíte mít práva a jednak to prostě nemusíte chtít – v tom případě použijte příkaz..
..a balíček bude umístěn do speciálního uživatelského adresáře.
Příkaz install toho ale umí mnohem, mnohem více – může uvedený balíček pouze stáhnout, ale neinstalovat (-d
), může při instalaci vynechat závislosti (--no-deps
), můžete si po něm vyžádat předkompilaci souborů *.py na *.pyc (--compile
), můžete instalovat balíčky podle seznamu v souboru (-r
) a spoustu jiných věcí. Nejužitečnější pro normálního smrtelníka asi bude ale příkaz..
-u
.
..který prostě vezme všechny balíčky (nebo uvedený) a přeinstaluje je na nejnovější verzi.
--user
stejně uvést, jinak apgrejdlá knihovna skončí v globálním adresáři.
Upozorněme ještě na jedno použití příkazu install – instalaci konkrétní verze balíčku (a ne tedy nutně pouze poslední):
Otázka, kam vybraný balíček nainstalovat, není tak jednoduchá, jak se může na první pohled zdát. Základní rozdělení podle pravidla „--user nepotřebuje administrátorská práva“ se sice jeví jako přirozené, ale velmi rychle také narazí na své hranice – budete-li totiž slepě instalovat všechny balíčky na libovolné jedno místo, časem skončíte s takovým odpuštěním bordelem, že vás už zachrání jenom kompletní výmaz (který se pravda pod lokací z --user dělá podstatně snáz).
Ve skutečnosti jde spíše o to, že dané pythoní běhové prostředí by asi nemělo zbytečně obsahovat balíčky, které v jeho rámci nepotřebujete. Budete-li vyvíjený kód s někým sdílet nebo dokonce distribuovat, pořádek v balíčcích, které jsou k jeho provozu potřeba, je k nezaplacení. Nehledě na to, že spousta balíčků závisí na jiných balíčcích, a snadno se vám stane, že různé závislosti budou vyžadovat různé verze toho samého balíčku.
Doporučením by tedy asi mohlo být, že pro základní práci si vystačíte s --user, ale pro cokoliv většího začnete používat virtuální běhová prostředí.
Jak jsem už zmiňoval, je pip zřejmě prvním skutečně použitelným balíčkovacím systémem pro Python, a to především proto, že umí nainstalované balíčky zase odinstalovat:
Pro balíčky, které sám instaloval, je odinstalace (většinou) bezproblémová, ale dokáže si poradit i se spoustou dalších variant (s výjimkou především balíčků nainstalovaných pomocí python setup.py install
).
Narozdíl od instalace nejsou při odinstalaci celkem pochopitelně zahrnuty závislosti – rozhodnout se, zda je již nepotřebujete, a zbavit se jich, je tak na vás.
Ačkoli se jméno potřebného balíčku většinou dozvíte jinou cestou a nejspíš si ho dohledáte na webu PyPI dopředu sami, umožňuje pip prohledávat dostupné balíčky i z příkazové řádky:
PS: Parametrem --index URL
si můžete vynutit prohledávání jiného balíčkovacího systému.
Jsou-li instalované balíčky „čistý“ Python, není s nimi většinou vůbec žádný problém. Často však balíčky obsahují binární komponenty, ovšem v klasické podobě jsou distribuovány pouze v podobě zdrojových kódů a instalace tak zahrnuje i jejich kompilaci do cílové binární podoby.
Zatímco pod unixovými systémy není co řešit, na Windows musíte nainstalovat MinGW a následně dát Python'u vědět, že jej může pro kompilaci využít, vytvořením souboru pydistutils.cfg ve svém domovském adresáři, do nějž stačí uvést:
Tento konfigurační soubor toho umí více (třeba i přepsat cílové umístění vytvořených balíčků), ale pro instalaci balíčků s binárními komponentami více potřeba skutečně (a kupodivu) není.
PS: K testování nastavení je vhodný například balíček markupsafe – obsahuje soubor _speedups.c, který se v případě úspěchu při instalaci přeloží na binární komponentu _speedups.pyd, ale přitom je schopen fungovat i bez ní.
Neustálá rekompilace binárních komponent se může velmi rychle stát pěkně otravnou (třebas při správě skupiny počítačů), nehledě na to, že pro většinu uživatelů operačního systému Windows je velmi těžko proveditelná. Nepřekvapí proto, že už nejstarší balíčkovací systémy Python'u umožňovaly distribuci binárních komponent již zkompilovaných. To s sebou ale samozřejmě neslo hromadu jiných problémů (různé verze pro různé cílové platformy), takže pip podporu distribuce binárních komponent z praktických důvodů vůbec neobsahuje.
K té primárně slouží až nejnovější formát balíčků wheel. Soubory mají typicky příponu whl a prakticky jde o zazipovaný adresář s definovanou vnitřní strukturou obsahující kromě vlastních pythoních zdrojáků a zkompilovaných komponent především metadata.
Jelikož zvláště pod Windows není kompilace binárních komponent v naprosté většině případů běžně proveditelná, zůstávají uživatelé odkázáni na dobré duše, které připraví instalátory s binárními komponentami již zkompilovanými. Některé projekty je poskytují samy, pro ostatní je zde pak především „kompilační hrdina“ Christoph Gohlke. Výhodou jeho byť instalátorů je fakt, že často již vyhovují standardu wheel, takže je můžete celkem snadno předělat na klasické wheelovské balíčky a ty už instalovat se všemi možnostmi, které nabízí pip.
Příklad instalace wheel'u a následně binárního balíčku lxml:
Použití pip'u je vřele doporučováno i na platformách, které jinak mají vlastní balíčkovací systémy (např. Linux) – nemůžete totiž očekávat, že platformně závislý balíčkovací systém bude obsahovat všechno a ještě navíc v poslední verzi. pip je tak mnohem univerzálnější volba (a to i když nepracujete ve virtuálních prostředích).
Pro Windows je pak použití programů pip a wheel víceméně jedinou možností, jak se vyhnout zaneřáďování gobální instalace.