Newsletter 365tipů můžete číst zdarma. Placené předplatné je dobrovolná podpora, která pomáhá webu pokračovat.
Podpořit 365tipů

TIP#3344: Nahradí uv pipx? Pro běžné použití ano, ale nejsou úplně stejné

Jeden příkaz spustí Pythonový nástroj bez trvalé instalace, druhý ho zpřístupní v Terminálu. Rozdíly se projeví hlavně u práce s projektem a u pokročilejších funkcí pipx.

POZNÁMKA: Pokouším se převést SKILL z ChatGPT do Hermes. A tohle je testování. Především to prostě nejde udělat tak že ho tam dáte a ono to bude fungoat. Nebude, je to Hermes, jiné systémové instrukce, jiný model (byť taky ChatGPT) a je to víc natvrdlé, mnohem víc to nedodržuje co SKILL říká. Ladění SKILl tomu moc nepomůže, ale jsem si jist že to chce lepší zadání, než jen téma (tedy v tomto případě JEN titulek „uv/uvx jako náhrada pipx?„). Byť ChatGPT to i z toho zvládne. A je jasné, že možná bude lepší udělat dvoufazové psaní – rešerši s návrhem struktury a obsahu, a teprve po doladění tohoto, finální článek.

Krátká odpověď: pro běžné spouštění a instalaci samostatných Pythonových nástrojů může uv pipx nahradit. uvx odpovídá příkazu pipx run; trvalou instalaci řeší uv tool install, podobně jako pipx install. Není to ale úplně totožná náhrada. pipx má několik funkcí navíc a v některých případech můžete zůstat u jeho příkazů, ale nechat ho používat uv na pozadí.

Kdy použít uvx a kdy uv tool install

Jako příklad poslouží Black, formátovač Pythonového kódu. Jednorázově ho můžete spustit například takto:

uvx black --version

uvx je zkrácený zápis příkazu uv tool run. Oba spustí nástroj v odděleném prostředí, aniž byste ho museli trvale instalovat. Přesnou rovnocennost příkazů i oddělení prostředí popisuje dokumentace uv.

Pokud chcete Black používat pravidelně jako běžný příkaz v Terminálu, nainstalujte ho:

uv tool install black

Pak by měl být dostupný příkaz black, například:

black --version

Pokud ho shell nenajde, zkontrolujte PATH. Pomoci může uv tool update-shell, které přidá adresář s nástroji do běžných konfiguračních souborů shellu.

Při běžném používání jsou hlavní příkazy podobné:

Co chcete udělatpipxuv
Jednorázově spustit nástrojpipx run black --versionuvx black --version
Trvale nainstalovatpipx install blackuv tool install black
Odinstalovatpipx uninstall blackuv tool uninstall black
Vypsat nainstalované nástrojepipx listuv tool list
Aktualizovat všechny nástrojepipx upgrade-alluv tool upgrade --all

Srovnání vychází z aktuální dokumentace pipx k rozdílům mezi pipx a uv tool. Pro běžné samostatné nástroje je převod mezi těmito příkazy přímočarý.

Co přesně dělá uvx a jak je to s cache

uvx nástroj při každém spuštění znovu nestahuje od začátku. Vytvořené prostředí ukládá do cache, aby další spuštění bylo rychlejší. Je ale považováno za dočasné: když cache vyčistíte, uv prostředí při příštím spuštění znovu vytvoří. Nejde tedy o instalaci, kterou byste měli používat jako trvale dostupný příkaz.

Bez uvedení verze použije uvx při prvním spuštění aktuální vydání a později může dál používat uloženou verzi. Chcete-li výslovně spustit nejnovější vydání, napište:

uvx black@latest --version

Případně můžete obnovit prostředí v cache přepínačem --refresh:

uvx --refresh black --version

Je tu ještě jeden snadno přehlédnutelný detail: pokud jste nástroj už nainstalovali přes uv tool install, může uvx ve výchozím nastavení použít tuto nainstalovanou verzi. Chcete-li ji obejít, můžete přidat --isolated. Chování verzí popisuje dokumentace uv.

Proč si někdy nechat pipx

Pro běžné instalování a spouštění samostatných nástrojů není nutné přecházet. pipx má ale funkce, které nemají v uv tool přímý protějšek. Například pipx inject umí přidat balíček do prostředí už nainstalovaného nástroje. V uv lze při instalaci přidat závislost pomocí --with, ale dokumentace upozorňuje, že se prostředí přestaví. pipx má také runpip pro spuštění pipu uvnitř nástroje a podporuje systémovou instalaci přes --global; uv tato použití nepokrývá stejně. Podrobnosti uvádí srovnání obou nástrojů.

Přechod přitom nemusí znamenat změnu příkazů: pipx umí používat uv jako backend pro vytváření nových virtuálních prostředí a instalaci balíčků. Podle dokumentace pipx k uv backendu si pipx uv vybere, pokud je dostupný, zatímco jeho příkazy zůstávají stejné. Už existující prostředí si ponechají backend, se kterým byla vytvořena.

Pokud chcete pipx úplně nahradit, nejdřív se podívejte, co přes něj máte nainstalováno:

pipx list

Na Unixu používají pipx i uv ve výchozím nastavení pro příkazy často stejný adresář, ~/.local/bin. Při instalaci téhož nástroje přes oba správce proto můžete narazit na konflikt. Starou instalaci nejdřív odstraňte pomocí pipx a teprve potom ji instalujte přes uv. Nepoužívejte bez rozmyslu --force, které může přepsat existující příkaz.

Nepleťte si uvx a uv run

uvx spouští nástroj odděleně od prostředí projektu. Pokud ale nástroj potřebuje závislosti nebo kód konkrétního projektu, použijte uv run. Typickým příkladem jsou pytest nebo mypy, které mají běžet v prostředí projektu, ne ve zvlášť vytvořeném prostředí pro jednorázový nástroj. Na tento rozdíl upozorňuje dokumentace uv.

Jak uv nainstalovat

uv je dostupné pro macOS, Linux i Windows. Na Macu ho můžete nainstalovat přes Homebrew:

brew install uv

Ve Windows je k dispozici WinGet:

winget install --id=astral-sh.uv -e

Pro Linux a další možnosti odkazuje oficiální dokumentace instalace uv. Po instalaci ověřte, že je příkaz dostupný:

uv --version

Takže pipx smazat?

Pokud pipx používáte jen na běžné spouštění a instalaci samostatných Pythonových nástrojů, uv tyto scénáře pokryje: uvx pro jednorázové spuštění, uv tool install pro trvalou instalaci. Pokud využíváte speciální funkce pipx nebo vám jeho dosavadní nastavení funguje, není důvod migrovat jen kvůli uv. Klidně můžete zůstat u příkazů pipx a využít uv jako jejich backend.

Jestli s pipx teprve začínáte, stručný základ najdete v tipu Co je pipx a proč se hodí pro Pythonové nástroje spouštěné z Terminálu. A pokud si chcete zapamatovat jen tři příkazy: uvx spustí nástroj jednorázově, uv tool install ho nainstaluje natrvalo a uv run spustí příkaz v prostředí projektu.