Skip to content

Instantly share code, notes, and snippets.

@junkor-1011
Last active March 13, 2023 16:21
Show Gist options
  • Save junkor-1011/dffb3e622d4fdf6635c474a0e2a00781 to your computer and use it in GitHub Desktop.
Save junkor-1011/dffb3e622d4fdf6635c474a0e2a00781 to your computer and use it in GitHub Desktop.
pyenv + mambaforge note

pyenv + mambaforge(miniforge)を使った環境構築方法まとめ

0. はじめに

動機

Linux環境で極力ディストリビューションへの依存を廃した上で、 任意のランタイム・ライブラリを使ったPython環境を構築する

前提

  • 環境構築はLinux上を想定
  • 検証はUbuntu22.04LTS(WSL2)

出来るようになること

  1. conda-forgeリポジトリを使ったconda仮想環境の構築
    • 機械学習・データ分析や、Geometry演算など使用ライブラリの依存関係がシビアだったり、 そもそもcondaでのインストールを推奨されるPythonライブラリが存在する
    • ↑と被るが、JavaやNodejs, graphvizなど、pipで入れられないライブラリも同時にインストール可能
    • Anacondaリポジトリはライセンスの関係で使いづらいが、conda-forgeの方がライブラリ数や対応バージョンが多いのでconda-forgeリポジトリが使えれば基本的には代替可能
      • (ただし、Anacondaに比べて安定性は下がるかもしれない)
  2. 任意のPythonのバージョンを使ったvenvベースの仮想環境の構築
    1. Pipenv
      • はじめの構築時のみpyenv, miniforgeを使うが、それ以降は特に意識することなく使用可能になる
    2. poetry
      • はじめの構築時のみpyenv, miniforgeを使うが、それ以降は特に意識することなく使用可能になる

FAQ(?)

  • 普通に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からスムーズに切り替えが出来る

1. 環境構築(共通部分)

1-1. pyenv

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を使うと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

1-2. Mambaforge(Miniforge)

Mambaforgeはminicondaやminiforgeにおけるcondaコマンドの代替コマンド:mambaが使えるもの。condaをmambaに置き換えればそのまま使える。(逆に、以下で示す手順に関してmambaコマンドはすべてcondaに置き換えても動作する。mambaを使う気がなければminiforge3を使ってcondaコマンドを使うようにしても問題ない)

インストールは1-1.のようにpyenv経由で行っておく。

pyenvでインストールして作られた環境(base環境)は極力触らないようにして、base環境から用途に応じてconda仮想環境を作成してそちらを使うようにする

conda仮想環境の作成

yamlファイルを使わずに普通に作る場合

作成時:

# まずは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ファイルから環境を作成する場合

例えば次のような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

環境のexport

mambaforgeのbase環境に入って以下のコマンドを実行

# env_export.yamlに書き出す場合
mamba env export -n <環境名> > env_export.yaml

ここで書き出したyamlファイルを手順: "yamlファイルから環境を作成する場合"で使うことによって、環境の複製ができる (書き出されたyamlには元の環境名とインストール場所のパスも書かれているため、環境名の書き換えとインストール場所の削除、または変更を行う)

conda仮想環境の削除

pyenvからは消せないので、mambaforgeのbase環境からmambaコマンドで消す

pyenv shell mambaforge-<バージョン>
mamba remove -n <conda仮想環境名> --all

condaで環境構築をしたい場合、ここまでの手順で代替環境の作成が可能。

2. pyenv + mambaforge + pipenv

事前準備として、まずは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.

3. pyenv + mambaforge + poetry

事前準備として、まずは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.
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
name: pipenv-py3.10
channels:
- conda-forge
dependencies:
- python==3.10.9
- pipenv
- pip
name: poetry-py39
channels:
- conda-forge
dependencies:
- python=3.9.*
- poetry
- pip
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment