システムでインストールするPython(aptやyum, dnfなどでインストールしたり管理するもの)だとバージョンの指定が出来なかったり、 使用するディストリビューションによって使えるバージョンや依存ライブラリに制限がかかり、所望の環境を作れないことがある。
MiniforgeおよびMambaforgeを使うことで、 使うLinuxディストリビューションに対する依存性を極力小さくして移植性・再現性を持たせつつ様々なケースでPython環境の構築が可能になる。
- Anaconda
- ライセンスの関係で商用利用に制限(有償)、デフォルト環境が大量のライブラリを含むためインストールサイズが巨大になる
- miniconda
- ミニマルかつCLIベースでの利用のみが想定されているAnaconda、といった感じ
- defaultチャンネルはAnacondaリポジトリが設定されており、Anaconda同様商用利用には注意が必要
miniforgeはdefaultチャンネルがコミュニティベースのconda-forgeリポジトリ(商用利用の制限無し)に設定されているminiconda、といった感じで使用感に差が無い。
mambaforgeはminiforgeに更にcondaの代替コマンドであるmamba(conda
コマンドと互換性があり、C++で実装されているため高速)を追加したもの、といった感じ。
使えるライブラリのバリエーションはAnaconda公式リポジトリよりもconda-forgeリポジトリの方が多く、 そういった意味でもminiforge / mambaforgeを使うと多様なユースケースを満たす環境構築が可能 (もっとも、Anaconda公式リポジトリ版の方が安定性が高いとかそういうことはありそう)
基本的に公式リポジトリの記載に従う
# Mambaforgeのインストール
# installerをダウンロード
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh"
# installerの実行(対話形式で色々聞かれるので、適宜答えていく)
bash Mambaforge-$(uname)-$(uname -m).sh
# ※インスールパスをデフォルトから変える場合
bash Mambaforge-$(uname)-$(uname -m).sh -p /path/to/mambaforge-install-dir
Miniforgeや、pypy版のものを使う場合は適宜URLおよびインスールスクリプトのファイル名を修正する。
スクリプト実行後、次に実行すべきコマンドが表示されるのでその指示に従うとインスールが完了する。
# mambaforgeのbase環境に入る。YOUR_SHELL_NAMEはbashやzshなど
eval "$(/path/to/<Mambaforgeのインスール場所>/bin/conda shell.YOUR_SHELL_NAME hook)"
# ↓で.bashrcや.zshrcが自動アップデートされる
conda init YOUR_SHELL_NAME # YOUR_SHELL_NAMEはbashやzshなど
ここまでの手順を実行すると、次からshellを開いたときに自動でmambaforgeのbase環境に入るようになる
個人的には普通にシステム標準のPythonをそのまま使いたいケースも多く、 上記の手順によって乗っ取られる感じになるのは避けたい場合がある。
こうした状況の場合、conda init
による.bashrc
や.zshrc
の自動アップデートは行わない。
こうすれば普段はシステム標準のPythonがデフォルトで使われるままになる。
(mambaforgeにPATHが通っていないので、システム的にはインストールしていないのと同じ状態)
mambaforgeを使いたいときは、セットアップ用のスクリプトをsource
などで読み込めば良い。
すなわち、
# bash, zsh
source /path/to/<Mambaforgeのインストールディレクトリ>/etc/profile.d/conda.sh
source /path/to/<Mambaforgeのインストールディレクトリ>/etc/profile.d/mamba.sh
によって、conda
コマンドとmamba
コマンドが使えるようになる。
なお、この段階では単にconda
とmamba
が使えるだけで、まだPythonはシステム標準のままである。
この状態で
conda activate base
# mamba.shを読み込んでいればこちらでも可
mamba activate main
をすることでMambaforgeのbase環境に入り、PATHも書き換わってMambaforgeのPythonを優先して使うようになる。
若干手間だが、普段はシステム標準のPythonを使いつつ、必要に応じてスポットでcondaを使いたいときはこのようなやり方ができる
要するにconda
コマンド(mamba
コマンド)の使い方。
デフォルトチャンネルがconda-forgeに設定されているだけでminicondaやAnacondaと全く同じなので、 その辺りのリファレンスや解説記事の内容がそのまま使える。
公式リファレンス:
個人的に優先度の高い?コマンドを一応まとめておく
なお、Mambaforgeであればmamba
コマンドが使えるので、以下の手順においてconda
をmamba
にしてもそのまま同じように動作する
参考:
base環境はあまり汚さず、用途ごとに使い捨てのconda仮想環境を作成・管理する方がメンテナンス上良いことが多い。
アドホックな感じで使う環境であれば、
conda create -n <作成するconda仮想環境名> python=<使いたいバージョン> (+その他使いたいライブラリ)
のような感じで作れる
例えば、
# python 3.9系を使用し、はじめにjupyterlabをインストールしておきたい
conda create -n py39-jupyter python=3.9 jupyterlab
# これも↑と同じ
conda create -n py39-jupyter python==3.9.* jupyterlab
=
や==
をライブラリ名の後に付けることでバージョンを指定出来る。==
の方が詳細で、SemVerのパッチバージョンまで指定する。
また、ワイルドカード*
も指定出来る。
作成済みのconda仮想環境の一覧を見るには
conda info --env
を実行する。
作成したconda仮想環境を有効にするには、
conda activate <conda仮想環境名>
とする。
パッケージのアップデートなどは、
# 依存関係の解決に時間かかるので、使えるならconda -> mambaに置き換えたほうが快適かもしれない
# パッケージの追加
conda install <パッケージ名>
# パッケージの削除
conda uninstall <パッケージ名>
# パッケージのアップデート
conda update <パッケージ名>
などと出来る。
ただし、環境作成後に上記のコマンドを多数繰り返していくと再現性が取りづらくなりがちで、 意図しないタイミングで壊れることもあるので真面目にメンテナンスする環境ではあまり推奨しない。
事前に一定のフォーマットに沿って記述されたyamlファイルを用意しておき、 それを読み込むことで環境を作成出来る。 yamlファイルをgitなどでバージョン管理しておくことで、どのようにしてその仮想環境を作ったのかが相対的に管理しやすくなるので個人的には推奨
yamlファイルは既存の環境からエクスポートしたもの(後述)が使える他、以下のように最低限の条件を指定出来る。
# create-env-example.yaml
# name: 作成されるconda仮想環境の名前になる
name: jupyter-example
# channesls: miniforge/mambaforgeではデフォルトがconda-forgeなので無くても同じ挙動になるが、移植性のため一応書いておく
channels:
- conda-forge
# dependencies: condaでインストールするライブラリ(依存関係は自動で解決され、インストールされる)。必要に応じて詳細にバージョンを指定できる。
dependencies:
- python==3.10.9
- jupyterlab
- pandas
- numpy
- matplotlib
- seaborn
- pyarrow
- polars
# pipで入れたいものがある場合は以下も記述
- pip
- pip:
# ↓のライブラリはpipでインストールされる
- python-language-server[all]
- pyls-black
- pyls-isort
- pyls-mypy
- yapf
↑のように用意したyamlファイルを使って、公式リファレンスのようにして
# yamlファイル名は実際に使うものの名前に置き換える
conda env create -f create-env-example.yaml
のようにconda仮想環境を作成できる
pip freeze
のconda版と言える。
現在の仮想環境の状況を完全に再現するための情報をexportすることができ、ここで生成したyamlファイルをgitなどで管理することで追跡性や再現性を高めることが出来る。
例えば、
# 現在の環境をexport
conda env export > env_freeze.yaml
# 仮想環境名を指定
conda env export -n <conda仮想環境名> > env_freeze.yaml
のようにするとenv_freeze.yaml
に環境を書き出すことが出来る。
(依存関係も含めた全てのライブラリに関して、詳細なバージョン情報に加えてリポジトリやビルドバージョン?なども記述されている)
なお、yamlファイルを使ったconda仮想環境の作成でこのyamlファイルを使用できるが、仮想環境名のname
やインストールパスのprefix
などは適宜変更や削除(prefix
)したりすると良い
conda remove -n <conda仮想環境名> --all
- Qiita - Anacondaでよく使うコマンド
- Qiita - condaコマンドの使い方メモ
- conda環境の保存と再構築の仕方
- Anacondaで仮想環境構築・削除
- 【Anacondaの使い方】よく使うcondaコマンド一覧【チートシート】
- minicondaの使い方!インストールから基本コマンド
- Condaコマンド
condaはパッケージ管理ツールとしては機能が貧弱だったり、conda仮想環境は結構ファットな感じでストレージもかさみがちだったり、といったデメリットもあるので、 conda仮想環境を使わずにpipenvやpoetryで環境構築をしたい場合も普通に結構ある。
ただ、これらのツールで管理出来る対象は基本的にpip
でインストール出来るライブラリである。使用するPythonのバージョンの制約条件も記述出来るが、そのバージョンのPythonを用意するのは別途自分でやらないといけない。
pyenvを使うことでもこの課題は解消出来るが、pyenvで指定したPythonのインストールを行うと依存ライブラリの関係でWarningなどが出て大変なこともある。
別解としてmambaforgeなどを使うことでも対処出来るので紹介しておく。
共通したアプローチとして、所望のPythonのバージョンのなるべくミニマルなconda仮想環境を作っておき、その環境のpythonを使ってvenv
の仮想環境を作る、といったものになる。
例えばPython3.9系でやるとして、以下のようなyamlファイルを作成する
# create-env-py39.yaml
name: py39
channels:
- conda-forge
dependencies:
- python=3.9
- pipenv
- poetry
- pip
mambaforgeのbase環境に入り、上記のyamlファイルから仮想環境を作成してactivateする
# conda仮想環境作成
conda env create -f create-env-py39.yaml
# conda仮想環境のactivate
conda activate py39
プロジェクトを作成するディレクトリに移動し、
# conda仮想環境をactivateしておく(今回の例だとpy39)
# venv仮想環境をプロジェクト直下に作る設定でpipenvプロジェクトを開始する
PIPENV_VENV_IN_PROJECT=true pipenv install
なお、pyenv
などでインストールした他のバージョンのpythonがあると、そちらで勝手に仮想環境を作り始めることがある。そうした場合は面倒だがPipfile
以下のような感じで修正し、
# Pipfile(抜粋)
[requires]
python_version = "3.9" # <- ここを所望のバージョンに直す
ついで既に作成済みの.venv
を一回消去してからpipenv install
をやり直す。
内部的にmambaforgeのPythonを参照している.venv
をプロジェクト直下に作ることで、以降はconda activate
不要となる。
すなわち、プロジェクト作成以降はcondaではなくシステムでインストールしたpipenvを普通に使えば良い。
(むしろmambaforgeは無効にしておくと良い)
# conda activateはせず、システムのPython, pipenvを使う
pipenv install <package-name>
pipenv install --dev <package-name>
pipenv shell
# (...)
プロジェクトを作成するディレクトリに移動し、以下のコマンドを実行
# conda仮想環境をactivateしておく(今回の例だとpy39)
# venv仮想環境を作成
python -m venv .venv # この.venvはmambaforgeのpythonを参照する
# poetryプロジェクトを作成
poetry init # 対話形式で色々聞かれるので適宜返答する
以降はcondaではなくシステムでインストールしたpoetryを使ってこのプロジェクトを管理する。
# conda activateはせず、システムのPython, poetryを使う
poetry add <package-name>
poetry add --group dev <package-name>
poetry shell
# (...)