🐍

システムのPythonと共存させる形でのconda(Mambaforge)の導入方法

2023/03/16に公開

個人的な備忘録。
Pythonの環境構築方法は無限(?)にあるので、あくまでもいちサンプルとして。

あと前提としてLinux上での環境構築を想定しています。

動機・目的

condaは何だかんだいって便利である。

パッケージマネージャーとしてpip並みに貧弱で微妙ではあるが、
ほぼほぼ任意のバージョンのPythonをインストール出来るし、
pipではインストール出来ない依存ライブラリ(なんならJavaやnodejsなどまで)も一緒にインストール出来るので、(ディスク容量の消費と引き換えに)どの環境でもちゃんと動作してくれる移植性・再現性の高い環境構築が可能である。
ライブラリによってはcondaでのインストールが強く推奨され、conda経由でインストールしないと動作しなかったりパフォーマンスが落ちるものもあったりするので、状況次第では使わざるを得ない場合もある。

ただし、普通にインストールするとシステムをジャックされる感じになる=システム標準のPython が普通に使えなくなったり、他のPython向けの環境構築ツールが使いづらくなったりするので個人的には避けたい事情があり、基本はシステム標準のPythonをメインで使えつつ必要なときだけcondaコマンドを使えるようにする方法を検討した。

condaを使うためのツールについて補足

今回はMambaforgeを使えるようにする。

関連性のあるツールと比較すると:

  • 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をインストールする。
(なお、miniforgeやminicondaを入れたい場合でもほぼ同様に出来るはず)

環境構築方法

(個人的に使うやり方が)2通りほどあるのでそれぞれについて記す。

検証環境:

  • Ubuntu22.04LTS(WSL2@Windows11)上で確認。
  • インストールしたMambaforgeのバージョン: 22.11.1-4

1. pyenvからmambaforgeをインストール

あらゆるケースに対処できる方法として、pyenvを使う選択肢があり、実際今までよく使っていた。

pyenvはAnacondaやminiconda, miniforge/mambaforgeもインストールすることが可能であり、更にpyenv-virtualenvを使えばconda仮想環境もpyenvの中で便利に扱うことが出来る。
例えば

# インストール可能な候補の検索
pyenv install --list | grep mambaforge # miniforgeやminicondaなども同様にできる

# インストール(例)
pyenv install mambaforge-22.9.0-3 # バージョンはあくまで一例(以下も同様)

# mambaforgeのbase環境の有効化
pyenv shell mambaforge-22.9.0-3 # base環境

# mambaforgeで作成したconda環境を有効化
pyenv shell mambaforge-22.9.0-3/envs/env-hoge

# 環境の確認
pyenv versions # インストール済みのmambaforgeや、condaで作成した仮想環境も確認出来る

といった感じ。

pyenv global system

としておいてデフォルトはシステム標準のPythonを使うようにし、必要なときだけpyenv shellpyenv localでmambaforgeなどを使うようにしておくことで冒頭の動機・目的で書いた要件を満たせる。

pyenv自体のインストールはAutomatic installerなどが便利だった。(pyenvとpyenv-virtualenvまで自動でセットアップされる)

curl https://pyenv.run | bash

他のインストール方法は公式GitHub - Installationを参照

デメリットなど

  • pyenvの使い方と、conda cliの両方をある程度知らなくてはならない
  • システムのPythonに影響するのが嫌だ、と冒頭で書いているが、何だかんだpyenvにシステムのshellを少しジャックされる
    • 代表的なところでいうとwhichコマンドをpyenv whichに置き換えないと正しいパスが見れない、といった感じのことが起こる

2. システム標準のPythonをデフォルトにしたままでMambaforgeをインストールする

conda / mamba コマンドだけ使える状態にしておいて、必要なときだけconda環境に移れるようにセットアップする。

基本的には公式リポジトリの記載に従ってインストールする

# Mambaforgeのインストール

# installerをダウンロード
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh"

# installerの実行(対話形式で色々聞かれるので、適宜答えていく。)
# →今回はライセンス確認だけyesにして後は全部Enterを押してデフォルトにした
bash Mambaforge-$(uname)-$(uname -m).sh

# ※インスールパスをデフォルトから変えたい場合はpオプションで指定できる
bash Mambaforge-$(uname)-$(uname -m).sh -p /path/to/mambaforge-install-dir

Miniforgeや、pypy版のものを使う場合は適宜URLおよびインスールスクリプトのファイル名を修正する。

スクリプト実行後、次に実行すべきコマンドが表示されるのでその指示に従うと通常のインストールが完了するが、これをやるとshellを開いた瞬間にmambaforgeのbase環境が有効になる=システム標準のPythonがジャックされて使えなくなるので今回は無視する

ここまでで、完全にデフォルト設定でやると$HOME/mambaforgeディレクトリが出来ているが、インストーラの指示は無視しているので特にPATH設定などはダウンロード前と変わらない(システム的にはインストールしていないのと同じ)、という状況になっているはず。

ここで、condaコマンドとmambaコマンドだけは使えて欲しいので、bashを使っている場合であれば以下を.bashrcなどに追記する(zshなら.zshrcに同様の内容を追記する)

.bashrc
# 以下を追記
source "$HOME/mambaforge/etc/profile.d/conda.sh"
source "$HOME/mambaforge/etc/profile.d/mamba.sh"

こうしておくと、mambaforgeのcondabinというディレクトリだけにPATHが通っている状態になり、condaコマンドとmambaコマンドだけ使える状態になっている。(デフォルトのPythonはシステム標準のまま)

この状態で

conda activate base

# mambaも使えるので↓でも同じ
mamba activate base

とすればmambaforgeを有効にすることが出来る。あとは普通にcondaコマンドやmambaコマンドを使って環境構築をしていけばOK。

pyenvを使う場合に比べると、

  • conda activate <baseか作った仮想環境>をした後はシェルを開き直さないとシステム標準のPythonをデフォルトに戻せない
    • 頻繁にシステムのPythonとconda環境を行ったり来たりする場合は不便
  • pyenvの方が更に色々とインストール出来るので、出来ることの幅は少し狭い

といったデメリットがあるが、

  • システムを乗っ取られる度合いはpyenvのときよりだいぶ小さい
  • condaコマンドだけ覚えておけば良いので、pyenvも併用するのに比べると学習コスト・ハードルは抑えられる

といったメリットもある。

補足: vscodeとの連携

Visual Studio CodeのPython拡張を使うと自動で使えるPython環境をリストアップして使える機能があり、便利である。この際、conda仮想環境もその対象になるが、ログイン直後のshellがcondaコマンドを叩ける状態に無いと正しく動いてくれない。(参考: conda env listの結果を参照するため、vscodeがcondaコマンドを常に実行出来る状態にしておく必要がある)

システム標準のPythonが乗っ取られるのを防ぎつつ、↑のように正しくvscodeから自動でconda仮想環境を参照出来るようにする方法として、今回のようなやり方を考案している。


蛇足: condaとPipenvやPoetryとの連携

pyenvとの併用・連携は既に書いたので。
よく競合?として挙げられるPipenvPoetryだが、連携させて使うことも出来る。

pipenvやpoetryは使用するPythonのバージョンを制限してプロジェクトを作れるが、そのバージョンのPythonそれ自体をインストールのは別途自分でやらないといけない。

例えば、Python3.11のプロジェクトを作りたい場合で、そのLinuxディストリビューションのパッケージ管理ツール(aptとかyum, dnfなど)で入れられるのが3.9まで、といったケースだと少し大変だったりすることになる。

こういったケースへの対処としてpyenvなどが有効であるが、今回紹介したような形でmambaforgeなどで作ったconda仮想環境を利用することも可能である。

要は、conda仮想環境を作る際は

conda create -n <conda仮想環境名> python==3.11.0

といった形でpythonのバージョンを指定して環境を作ることが出来る。
こうやって作った仮想環境でpipenvやpoetryのプロジェクトを立ち上げると、
内部的にconda仮想環境のpythonを参照するvenv仮想環境が作ることができる。

# 使いたいバージョンのpythonのconda仮想環境を作成
conda create -n py3_11 python=3.11 pipenv poetry
conda activate py3_11

# pipenvの場合
mkdir -p /path/to/pipenv-sample
cd /path/to/pipenv-sample
PIPENV_VENV_IN_PROJECT=true pipenv install # プロジェクトディレクトリ直下にPipfileと.venvを作成
ls -la .venv/bin/python # -> <mambaforgeのインストール場所>/envs/py3_11/bin/python

# poetryの場合
mkdir -p /path/to/poetry-sample
cd /path/to/poetry-sample
python -m venv .venv # プロジェクトを作成する場所にvenv仮想環境を作成
ls -la .venv/bin/python # -> <mambaforgeのインストール場所>/envs/py3_11/bin/python
poetry init # 対話形式で色々聞かれるので適宜答える

pipenv, poetryいずれも上記のようにしてプロジェクトを作成した後はconda仮想環境に入る必要は無く、システム標準で入れたpipenvコマンドやpoetryコマンドを使えば良い。

といった形で、condaはパッケージマネージャーとしてconda仮想環境を作って運用する以外にも、指定したバージョンのPythonをインストールするためのツールとして使うのにも意外と有用だったりするので、関連して補足しておく。

GitHubで編集を提案

Discussion