Python環境およびPython製アプリ
これは,システム管理者と,一般ユーザの戦いである.
ユーザはシステムを使うことはできるが,いじれない.管理者のみがいじれる.
ユーザは,そんなシステムに入っているPythonのパッケージに不満がある.
- 使いたいパッケージが無い
- 使いたいパッケージのバージョンが無い
ユーザは,そんなときどうするか?管理者にパッケージを入れろと言ってくる.
パッケージの依存関係などお構いなしに.管理者としては到底受け付けられない.
ユーザは,仕方ないので自分のホームにパッケージを入れる.
pip
は,--user
をつければよい.ホームにsite-packages
が用意され,以降,python
はホームのsite-packages
,システムのsite-packages
のどちらも探索する.
$ pip install --user foo
foo
を入れようとすると,依存関係で芋づる式にbar
とhoge
も入れようとする.
bar
はシステム側に既に存在しているが,必要なバージョンが異なるので,別のbar
も入れる.
hoge
もシステム側に既に存在し,こちらはそれでよいから,ホームには入れない.
あるときfoo
のバージョンが上がって,依存関係もアップデートされた.またシステムとホームのせめぎ合いだ.
python
_{user} のすゝめ:ユーザは,システムに面従腹背するか,システムに不満があるならホームで完結せよ.
1. ということで,システムのsite-packages
を探索しないようにすることを勧められる.
いわゆる PEP668 である.
python -m pip install --user foo
[un-recommended] これをやめる事を薦められている.システムによっては許されない場合がある.強引にやるなら,さらに--break-system-packages
をつける.野蛮だ.
~/.local_python/bin/python -m pip install foo
[recommended] ホームのsite-packages
だけを探索するようにする最もリーズナブルな方法は,独自のpython
を使い,システム側のpython
を使わないということである.
python
_{s} で作る仮想環境
case1. - ホームの
python
: システムの_{u} python
のコピーのようなもの_{s} - ホームの
site-packages
:_{u} python
の探索範囲_{u}
$ python -m venv ~/.local_python # このpythonはシステムのもの(venvも)
$ cat 'export PATH="~/.local_python/bin:$PATH"' >> ~/.zshrc # 以降,pythonはホームのもの
$ source ~/.zshrc
pyenv
やmise
などで新たな環境
case2. - ホームの
python
:_{u} pyenv
やmise
などでシステムと別個に新たに用意 - ホームの
site-packages
:_{u} python
の探索範囲_{u}
$ mise install python@latest # @以下はバージョン
$ mise use -g python@latest
ちなみに,
ちなみに,@system
というバージョンは特別であり,python
python
」を設定する.
これは,system
ではあるが,必ずしもシステム側のpython
あくまで「PATHで設定されたpython」,つまりは,case1のように仮想環境にpythonを作って,そのpythonがPATHから見つかるように設定されていれば,@system
は仮想環境のpythonを指す.
(PATHからpython
を見つけることができないならば,@system
は何も見つけられない.設定はできるが,実際にpython
コマンドを起動しても
mise No version is set for shim
となるだけ.)
単なるpython
コマンドがどのPythonなのかを管理するのはとても大切である.
python
_{dev} のすゝめ:開発環境は,それぞれ自己完結に(他の誰にも依存しない)
2. ユーザも,プログラミング課題に取り組む際には,開発側から見て,先のシステムVSユーザの関係に同等となる.
複数のユーザに対応する管理者が如く,
課題で必要なsite-packages
は,別の課題で必要なsite-pacages
と競合し,さらにはホームのsite-packages
ともせめぎ合う.
ということで,開発環境ごとに,それぞれ自己完結させたほうがいい.
python -m pip install foo
[un-recommended] やめたほうがいい.PEP668のように怒られず,すんなりsite-packages
(pkg1) python -m pip install foo
[recommended] 先と同様に,ホームのpython
python
python
python
_{u} またはpython
_{s} で作る仮想環境
case3. $ python -m venv pkg1 # このpythonはホームまたはシステムのもの
$ source pkg1/bin/activate
(pkg1) $ python -m pip install foo
poetry
やrye
などを使う
case4. 結局case3と同じように仮想環境を作るのだけれども,case3よりパッケージ開発に向いている.
$ poetry new pkg1
$ cd pkg1
$ poetry env use ~/.local_python/bin/python # どのpythonを使うか
$ poetry add foo
$ poetry install --sync
$ poetry version major/minor/patch
python
_{app} のすゝめ:pip install app
で入れるアプリ
3.インストーラであるpip
,引いてはそのpip
を持つpython
のsite-packages
と競合する可能性がある.PEP668
なので,これもアプリ独自のpython
で入れたほうがよい.
python -m pip install app
[un-recommended] まぁ,やっちゃうけれど.
(venv_app) python -m pip install app
[recommended] case5. 仮想環境を用意する.
先と同様.
$ python -m venv ~/.local/venv_app # このpythonは,システムだったりホームだったり
$ ~/.local/venv_app/bin/python -m pip install app
$ export PATH="~/.local/venv_app/bin:$PATH"
pipx
を使う
case6. venvを生で使うより,扱いやすい.
$ pipx install app --python ~/.local_python/bin/python # どのpythonを使うか
$ pipx ensurepath
ちなみに,pipx
自体もpip install
型.pipx
はvenv
で入れるのがいいかもね.
まとめ
- 普段使いも,開発でも,アプリインストールでも,独自の
python
を使う. - それぞれに独自
python
を用意するアプリがある.- 普段使い:
pyenv
,mise
- 開発:
poetry
,rye
- アプリインストール:
pipx
- 普段使い:
- 呼び出す
python
,site-packages
がどれなのか意識する.
Discussion