Predtým som písal o tom, čo
som skúšal a čo fungovalo a čo nie, keď som sa snažil uspokojiť príkaz
:checkhealth neovim pri detekcii Python providera na Mac M3.
Áno, riešenie fungovalo, ale bolo menej ako optimálne kvôli použitiu
možnosti --break-system-packages, ktorá by sa používať nemala. Je
navrhnutá tak, aby znela desivo hneď na prvý pohľad. Hoci som nenatrafil na
žiadne situácie, ktoré by som klasifikoval ako rozbitý systémový balíček,
odvtedy som našiel lepší, dúfajme správny spôsob, ako nainštalovať
pynvim tak, aby to neovim uspokojilo.
Úvod #
Na začiatku bola táto správa. Objaví sa, keď je Python nainštalovaný cez Homebrew. Je veľmi ťažké používať brew bez neho, pretože väčšina skutočne užitočných balíčkov, aspoň tie, ktoré používam, závisí od Pythonu.
Pokus o inštaláciu niečoho cez homebrew takto:
pip3 instal some_random_package
Vedie k nasledujúcej chybe:
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try brew install
xyz, where xyz is the package you are trying to
install.
If you wish to install a Python library that isn't in Homebrew,
use a virtual environment:
python3 -m venv path/to/venv
source path/to/venv/bin/activate
python3 -m pip install xyz
If you wish to install a Python application that isn't in Homebrew,
it may be easiest to use 'pipx install xyz', which will manage a
virtual environment for you. You can install pipx with
brew install pipx
You may restore the old behavior of pip by passing
the '--break-system-packages' flag to pip, or by adding
'break-system-packages = true' to your pip.conf file. The latter
will permanently disable this error.
If you disable this error, we STRONGLY recommend that you additionally
pass the '--user' flag to pip, or set 'user = true' in your pip.conf
file. Failure to do this can result in a broken Homebrew installation.
Read more about this behavior here: <https://peps.python.org/pep-0668/>
note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
Som si istý, že som chybovú správu vyššie vtedy starostlivo prečítal, a
dokonca som sa pokúsil použiť venv, ale som si istý, že sa mi to
nepodarilo. Nepamätám sa prečo. Každopádne, pre poriadok, uistíme sa, že
pip3 je v tomto prípade skutočne ten nainštalovaný cez Homebrew:
which pip3 # /opt/homebrew/bin/pip3
Ale v systéme je ešte jeden pip3…
Celosystémový Python #
Poznamenajme, že je možné úplne obísť vyššie uvedenú chybovú správu
spustením celosystémového pip3:
/usr/bin/pip3 install some_random_package
# Defaulting to user installation because normal site-packages is not writeable
Vyššie uvedené funguje, ale je to odrádzané aspoň z dvoch dôvodov:
- Python tam je starší, 3.9 oproti 3.13 v čase písania
- Je lepšie nechať systémový priestor čo najnetknutejší
Navyše, keďže systémový priestor vlastne nie je zapisovateľný, inštalácia
uloží súbory do používateľského priestoru pod ~/Library/Python/3.9/, čo
ho robí ešte ťažšie spravovateľným. Aký je teda správny spôsob?
Napravenie škôd #
Pred správnou inštaláciou pynvim sa najprv postarajte o možné škody.
Skontrolujte, či vôbec existujú celosystémové Python balíčky, dúfajme že
nie:
/usr/bin/pip3 list
Ak nejaké existujú, zvážte ich úplné odstránenie:
Upozornenie: Nasledujúci príkaz môže spôsobiť poškodenie vášho systému, pred použitím dôkladne skontrolujte.
/usr/bin/pip3 uninstall -y (/usr/bin/pip3 list | tail -n +3 | string split -f1 ' ')
Takto odstránené balíčky by mali byť nahradené, ako naznačuje dlhá chyba
vyššie, buď cez Homebrew pipx alebo cez virtuálne prostredie Python, o
ktorom tu budeme hovoriť v tomto príspevku.
Ďalší, istejší krok je odstrániť pynvim z Homebrew, keďže sme ho
nainštalovali nesprávne a chceme toto používanie zastaviť:
pip3 uninstall pynvim `--break-system-packages`
Všimnite si, že prepínač --break-system-packages je tu opäť potrebný,
dokonca aj na odstránenie; dúfajme, že váš systém nemá žiadne Homebrew
balíčky, ktoré na ňom závisia, čo je nepravdepodobné.
Používanie venv #
Teraz si prečítajte dlhú chybovú správu od začiatku. Vlastne obsahuje pokyny, čo robiť na používanie virtuálneho prostredia, ale nie presným spôsobom a chýbajú kľúčové body. Tu je kompaktný zoznam príkazov, ktoré mi fungovali:
mkdir -p ~/.config/nvim/venv
/opt/homebrew/bin/python3 -m venv ~/.config/nvim/venv
source ~/.config/nvim/venv/bin/activate
pip install pynvim
# Leave virtual environment
deactivate
Poznámka: pri použití shellu fish aktivácia zlyhá s chybou:
~/.config/nvim/venv/bin/activate (line 40): 'case' builtin not inside of switch block
case "$(uname)" in
^~~^
from sourcing file ~/.config/nvim/venv/bin/activate
source: Error while reading file '/Users/peterbabic/.config/nvim/venv/bin/activate'
V takom prípade použite špecializovaný aktivačný skript:
source ~/.config/nvim/venv/bin/activate.fish
Tiež poznamenajme, že umiestnenie prostredia je vhodne umiestnené v
~/.config/nvim/, kde sídlia moje ďalšie súbory súvisiace s neovim, čo
vyústi do prehľadného a čistého nastavenia.
Konfigurácia nvim #
Posledná dôležitá vec je nájsť a nahradiť parameter python3_host_prog z
Homebrew na venv vo vašom súbore .vimrc alebo init.vim:
let g:python3_host_prog = expand('~/.config/nvim/venv/bin/python')
Teraz znovu spustite :checkhealth v neovim. Teraz by si nemal sťažovať na
chýbajúci Python provider. Tu je možný výstup:
provider.python: require("provider.python.health").check()
Python 3 provider (optional) ~
- Using: g:python3_host_prog = "/Users/peterbabic/.config/nvim/venv/bin/python"
- Executable: /Users/peterbabic/.config/nvim/venv/bin/python
- Python version: 3.13.2
- pynvim version: 0.5.2
- OK Latest pynvim is installed.
Python virtualenv ~
- OK no $VIRTUAL_ENV
Príjemnú prácu!