pyenv+miniconda+conda-forge環境構築

pyenv+miniconda 環境で Python を実行しようとしたら,パッケージ参照先がずれる罠に引っ掛かりました.

インストール

pyenv

(GitHub からのインストールも可能)

terminal

$ brew update
$ brew install pyenv

Homebrew でインストールした場合はシェルの環境変数が自動的に書き込まれます(多分).

miniconda

Python 3 系の Miniconda をインストールします.

terminal

$ pyenv install miniconda3-latest
$ pyenv global miniconda3-latest

バージョンが切り替わっていることが確認できます.

terminal

$ pyenv versions
* system
  miniconda3-latest

バージョンが切り替わっていない場合,Miniconda のパスが正しく通っていない可能性があります.

環境設定

初期設定を行い,シェルを再起動します.

terminal

$ conda init zsh
$ exec $SHELL

Miniconda で conda-forge を利用するため,デフォルトのチャネルを削除します.

terminal

$ conda config --remove channels defaults
$ conda config --show channels
channels: []

参考:Anaconda の有償化に伴い miniconda+conda-forge での運用を考えてみた - Qiita

以下のコマンドでチャネルを追加できます.

terminal

$ conda config --add channels conda-forge

仮想環境構築

terminal

$ conda create -n myenv python=3.9 -c conda-forge --override-channels

環境構築時に Python もインストールします.インストールしなかった場合,仮想環境名 base の Python 実行ファイルが参照されるためパッケージの参照先がずれ,ModuleNotFoundError: No module named 'xxx' となってしまいます.

terminal

$ conda activate myenv
$ python
Python 3.9.13 | packaged by conda-forge | (main, May 27 2022, 17:01:00)
[Clang 13.0.1 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
['',
 '/Users/[user]/.pyenv/versions/miniconda3-latest/envs/myenv/lib/python39.zip',
 '/Users/[user]/.pyenv/versions/miniconda3-latest/envs/myenv/lib/python3.9',
 '/Users/[user]/.pyenv/versions/miniconda3-latest/envs/myenv/lib/python3.9/lib-dynload',
 '/Users/[user]/.pyenv/versions/miniconda3-latest/envs/myenv/lib/python3.9/site-packages']

上記のように,Miniconda 下の仮想環境がパスに追加されていれば OK です.

最後に

以前はコマンドの衝突を避けるために pyenv 上で Anaconda を利用していましたが,今はその問題が解決されているような話を耳にしました.

そうであれば,わざわざ pyenv 使わずとも Miniconda で Python バージョンとパッケージを管理すれば良さそうです.