Linux環境で極力ディストリビューションへの依存を廃した上で、 任意のランタイム・ライブラリを使ったPython環境を構築する
- 環境構築はLinux上を想定
- 検証はUbuntu22.04LTS(WSL2)
- conda-forgeリポジトリを使ったconda仮想環境の構築
- 機械学習・データ分析や、Geometry演算など使用ライブラリの依存関係がシビアだったり、 そもそもcondaでのインストールを推奨されるPythonライブラリが存在する
- ↑と被るが、JavaやNodejs, graphvizなど、pipで入れられないライブラリも同時にインストール可能
- Anacondaリポジトリはライセンスの関係で使いづらいが、conda-forgeの方がライブラリ数や対応バージョンが多いのでconda-forgeリポジトリが使えれば基本的には代替可能
- (ただし、Anacondaに比べて安定性は下がるかもしれない)
- 任意のPythonのバージョンを使ったvenvベースの仮想環境の構築
- Pipenv
- はじめの構築時のみpyenv, miniforgeを使うが、それ以降は特に意識することなく使用可能になる
- poetry
- はじめの構築時のみpyenv, miniforgeを使うが、それ以降は特に意識することなく使用可能になる
- Pipenv
- 普通にvenvやpipenv, poetryを使うのと何が違うのか?
- 任意のバージョンのPythonが使えるようになる。システムのPythonを使う場合、ディストリビューションに依存して使えるPythonのバージョンや使用できるライブラリが制限され、移植性の低下や出来ることの幅が落ちることにつながる。
- condaが不要な場合、pyenv + pyenv-virtualenvだけで良いのでは?
- 良いといえば良いが、pyenvで特定のバージョンのPythonをインストールするとライブラリ不足によるWarningが出て面倒なことがある。その点で、差し支えなければcondaでの環境構築が不要でもminiforgeを使うと楽かもしれない。
- miniforgeだけで良いのでは?(pyenv要らないのでは)
- pyenvを使うことでシステムのPython(
/usr/bin/python3
など)との切り替え・共存が出来る - pyenv-virtualenvを使うことにより、作成済みのconda仮想環境にpyenvからスムーズに切り替えが出来る
- pyenvを使うことでシステムのPython(
pyenvは公式のInstallationを参照。
特に、Automatic installerを使うと pyenv-virtualenvのインストールなどまで一緒にやってくれて楽(2023-03時点)
別途pyenv-virtualenvを入れる場合、公式のInstallationを参考にインストールを行う
最後に、適宜~/.bashrc
などを編集してPATHと初期化スクリプトの有効化を行っておく。
bashだと
# 公式のREADMEなどを参考に.bashrcに追記する
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv virtualenv-init -)"
などのような感じ
詳細は公式のUsageを参照
まずはインストール可能なリストを確認する
pyenv install --list
上記のコマンドで、現在インストール可能なバージョンの一覧が表示される
今回はmambaforgeを使う想定なので、出てきたmambaforgeの最新バージョンを入れておく
# ex)
pyenv install mambaforge-22.9.0-3
# miniforgeを使う場合はminiforge3の最新を指定
pyenv install miniforge3-22.11.1-4
pyenv versions
# ex)
# * system (set by /home/murayoshi-tomoyuki/.pyenv/version)
# 3.11.2
# 3.11.2/envs/project-hoge
# mambaforge-22.9.0-3
# mambaforge-22.9.0-3/envs/python3.10-base
# mambaforge-22.9.0-3/envs/python3.11-base
pyenv-virtualenvを入れておくと、各バージョンの中で作られた仮想環境も一緒にpyenvから参照出来る
conda仮想環境も一緒に管理可能 (conda仮想環境の作成は後述)
# 現在のshell上での切り替え
pyenv shell <version> # ex) pyenv shell 3.11.2
# 実行したディレクトリ以下で自動的にそのバージョンを使うようにする
pyenv local <version>
# デフォルトのバージョンを切り替える
pyenv global <version> # ex) pyenv global system
pyenvを使うとwhich
コマンドが~/.pyenv/shims/<コマンド名>
を参照するようになり、実体がどこにあるのか分かりづらくなる(pyenvのデメリットとも言える)
少しタイプ数が増えて面倒だが、which
コマンドをpyenv which
に置き換えると正しい位置を教えてくれるようになる
# example which
which python3
# /home/<user-name>/.pyenv/shims/python3
# example pyenv which
pyenv which python3
# /usr/bin/python3
Mambaforgeはminicondaやminiforgeにおけるcondaコマンドの代替コマンド:mambaが使えるもの。condaをmambaに置き換えればそのまま使える。(逆に、以下で示す手順に関してmamba
コマンドはすべてconda
に置き換えても動作する。mambaを使う気がなければminiforge3を使ってcondaコマンドを使うようにしても問題ない)
インストールは1-1.のようにpyenv経由で行っておく。
pyenvでインストールして作られた環境(base環境)は極力触らないようにして、base環境から用途に応じてconda仮想環境を作成してそちらを使うようにする
作成時:
# まずはmambaforgeのbase環境に入る
pyenv shell mambaforge-<インストールしたバージョン>
# conda仮想環境をmambaコマンドで作成
mamba create -n <環境名> <はじめにインストールするパッケージ(複数指定可能)>
# ex) mamba create -n test-env python=3.10.9 jupyterlab polars
# 作成したconda仮想環境にpyenvで入る
pyenv shell mambaforge-<インストールしたバージョン>/envs/<作成した環境名>
# ex) pyenv shell mambaforge-22.9.0-3/envs/test-env
あとはconda仮想環境でmamba
コマンドやconda
コマンドを使ってパッケージの管理をしていく
※メンテナンスがしづらいので、使い捨ての環境以外での使用は個人的には非推奨
例えば次のようなyamlファイルを用意する:
env-example.yaml
name: jupyter-example
channels:
- conda-forge
dependencies:
- python==3.10.9
- jupyterlab
- pandas
- numpy
- matplotlib
- seaborn
- pyarrow
- polars
# pipで入れたいものがある場合は以下も記述
- pip
- pip:
- python-language-server[all]
- pyls-black
- pyls-isort
- pyls-mypy
- yapf
mambaforgeのbase環境に入り、↑のyamlファイルから環境を作成する:
# mambaforgeのbase環境
pyenv shell mambaforge-<バージョン>
# yamlファイルを指定して環境作成
mamba env create -f <yamlファイルのパス>
# ex) mamba env create -f ./env-example.yaml
# pyenvからconda仮想環境に入る
pyenv shell mambaforge-<バージョン>/envs/<作成した環境名>
# ex) pyenv shell mambaforge-22.9.0-3/envs/jupyter-example
mambaforgeのbase環境に入って以下のコマンドを実行
# env_export.yamlに書き出す場合
mamba env export -n <環境名> > env_export.yaml
ここで書き出したyamlファイルを手順: "yamlファイルから環境を作成する場合"で使うことによって、環境の複製ができる (書き出されたyamlには元の環境名とインストール場所のパスも書かれているため、環境名の書き換えとインストール場所の削除、または変更を行う)
pyenvからは消せないので、mambaforgeのbase環境からmambaコマンドで消す
pyenv shell mambaforge-<バージョン>
mamba remove -n <conda仮想環境名> --all
condaで環境構築をしたい場合、ここまでの手順で代替環境の作成が可能。
事前準備として、まずはpyenvとmambaforgeで所望のバージョンのPythonでPipenvだけを含むミニマルなconda仮想環境を作る
ここでは例としてPython3.10.9のPipenv環境を作る
# env-pipenv.yaml
name: pipenv-py3.10
channels:
- conda-forge
dependencies:
- python==3.10.9
- pipenv
- pip
pyenv shell mambaforge-<バージョン>
# conda仮想環境: pipenv-py3.10を作成
mamba env create -f env-pipenv.yaml
# 作成したconda仮想環境を有効化
pyenv shell mambaforge-<バージョン>/envs/pipenv-py3.10
# 所望のディレクトリに移動し、pipenvプロジェクトを作成
cd /path/to/pipenv-project
PIPENV_VENV_IN_PROJECT=true pipenv install
上記の手順により、conda仮想環境: pipenv-py3.10
のPythonを使ってvenvが作成される。
一度仮想環境を作るとそれ以降はpyenv shell
などをせずに、システムのpipenvをそのまま使える
システムのデフォルトでpipenvを使えるようにするには、python3 -m pip install pipenv -U --user
などとする。
ほかにも例えばUbuntuだとapt install pipenv
などでインストール出来たりする。
# conda仮想環境ではなく、システムのpipenvを使用
pipenv shell # 仮想環境の有効化
pipenv install <package> # pipenvによるvenv仮想環境へのパッケージインストール
pipenv install --dev <package> # pipenvによるvenv仮想環境への開発用パッケージインストール
pipenv shell # pipenvによるvenv仮想環境のshellを起動
# e.t.c.
事前準備として、まずはpyenvとmambaforgeで所望のバージョンのPythonとpoetryだけを含むミニマルなconda仮想環境を作る
ここでは例としてPython3.9の環境を作る
name: py39
channels:
- conda-forge
dependencies:
- python=3.9.*
- poetry
- pip
# mambaforgeのbase環境
pyenv shell mambaforge-<バージョン>
# yamlファイルからconda仮想環境作成
mamba env create -f env-poetry.yaml
# pyenvからconda仮想環境有効化
pyenv shell mambaforge-<バージョン>/envs/py39
# poetryプロジェクトを作成する場所に移動し、venvで仮想環境を作る
cd /path/to/poetry-project
python -m venv .venv
# poetryプロジェクトの作成
python -m poetry init # 対話形式なので適宜回答する
次に、システムのPythonでpoetryを使えるようにしておく。
例えば
python3 -m pip install -U --user poetry
など
以降、システムのpoetryを使って、poetryプロジェクトの管理を行う
# conda仮想環境ではなく、システムのpoetryを使用
poetry shell # poetryによるvenv仮想環境のshellを起動
poetry add <package> # poetryによるvenv仮想環境にパッケージを追加
# e.t.c.