2
1

Anaconda から pyenv + venv に乗り換えてみた

Last updated at Posted at 2024-06-03

概要

Pythonには多くのバージョン管理ツール,パッケージ管理ツールがあります.今回はバージョン管理にpyenv,パッケージ管理にvenvを使った方法をまとめます.
venvの紹介記事では,多くの場合,ディレクトリごとに仮想環境を作っています.環境の複製はrequirements.txtを使って簡単にできますが,同じような環境が複数のディレクトリにまたがって存在してしまう可能性があります.
今回は仮想環境を~/venvs/にまとめて置くことで効率的な仮想環境の管理を目的とします.

(この「root直下に仮想環境をまとめて管理する」記事を当初探していたのですがどうも見つからなかったので,もしかしたら致命的なNG行動なのかもしれません.もしそうでしたら教えて下さい.)

はじめに

はじめまして.初投稿の記事なので拙い部分は多分にあると思いますが,色々とご教授いただけると幸いです.

背景

さて,私がPythonをはじめて触ったのが2022年でした.当時先輩から「Anacondaで環境作ったら良いよ」と言われたのでAnacondaを入れて使っていました.当時は特に考えずに必要なパッケージがあれば手当たり次第にインストールしたため,環境は膨れ上がり,依存関係もごちゃごちゃになってしまいました.致命傷となったのはAnaconda-Navigatorが起動しなくなったことです.おそらくcondaコマンドとpipコマンドを混合して使っていたためにおきました.これからAnacondaで環境を作る方はcondaコマンドのみで管理するようにしましょう.
参考:https://qiita.com/dem_kk/items/74a3b14f949485ad56cb

2024年,Pythonをちゃんと研究で使う可能性が出てきたのでここらで環境を整理しようと思いました.
まずAnacondaのお掃除ですがこちらの記事を参考にしましたので貼っておきます.
https://weblabo.oscasierra.net/python-anaconda-uninstall-macos/

環境

name version
MacBook Pro Sonoma 14.3.1
Homebrew 4.3.2
pyenv 2.4.1
VSCode 1.89.1

本題

  1. pyenvの導入
  2. pyenvPythonをインストール
  3. venvで仮想環境の作成

pyenvの導入

pyenvPythonの複数バージョン管理を目的に導入します.

Homebrewを使ってインストールします.

brew install pyenv

インストールが終わったら以下の内容を.zshrcに書き込みます.pyenvを使うための事前準備です.

.zshrc
# pyenvの初期設定
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init --path)"
fi

書き終わったらターミナルで以下を実行し,.zshrcの内容を反映させます.

source ~/.zshrc

pyenvPythonをインストール

以下のコマンドでインストールできるもののリストが表示できます.

pyenv install --list

いっぱい出てきてびっくりしますが,上の方にスクロールしていくと数字だけの部分が出てきます.これが素のPythonのバージョンです.

  3.9.18
  3.9.19
  3.10.0
  ...
  3.12.2
  3.12.3

今回は3.12.33.9.19をインストールします.
インストールは以下のコマンドです.

pyenv install 3.12.3
pyenv install 3.9.19

これでインストールできました.実際に入ったか確認してみましょう.

pyenv versions

で確認できます.

username@somewhere ~ % pyenv versions
* system (set by /Users/username/.pyenv/version)
  3.9.19
  3.12.3

おそらくこのような表示になると思います.

(私の環境ではなぜかsystemがMac標準のPythonへのパスを示さず彷徨っています.特に不都合はないので放置していますがなにかわかる方いらっしゃれば教えていただけると幸いです.)

*がついているものが今選択されているPythonのバージョンです.
では先程入れた3.12.3に変更してみましょう.

pyenv global 3.12.3

pyenv versionsを実行してもらえれば*の位置が変わっていることがわかると思います.
試しにpython --versionwhich pythonを叩いてみてください.

ここまででpyenv経由でインストールしたPythonを利用することができるようになりました.
次はvenvでの仮想環境の作成です.

venvで仮想環境の作成

簡単です.

python -m venv [仮想環境名]

とするだけです.

今回はroot直下に仮想環境をまとめていきたいので次の準備を行います.

cd          //rootに移動
mkdir venvs //ディレクトリvenvsを作成
cd venvs    //venvsに移動

以上を1行ずつ実行してください.

次に仮想環境baseを作成します.venvsにいる状態で以下のコマンドを叩いてください.

python -m venv base

これでpython3.12.3の仮想環境を作ることができました.
まだこの状態では仮想環境はアクティブでないので

source ./base/bin/activate

と打ってください.この状態でpipを用いパッケージをインストールするとこのbase仮想環境のみにパッケージが入ります.

python3.9.19の仮想環境を作りたい場合はpyenv global 3.9.19でグローバルのPythonを変更してから上記の手順を踏めばOKです.

仮想環境の切り方はターミナルでdeactivateと叩いてください.

VSCodeの設定

設定という設定ではありませんが,~/Documents/SugoiProjectがあるとします.SugoiProjectの中にはsugoi_program.pyが入っています.

  1. vscodeでSugoiProjectを開きます
  2. shift+command+Pでコマンドパレットを開きます
  3. 「python インタープリター」と入力すると「Python: インタープリターを選択」が出てくるのでクリック
  4. 作成した仮想環境へのパス,今回は~/venvs/base/を入力

これでvscodeがpythonを見つけてくれます.

~/venvsでまとめて管理することでvscodeでの使い勝手もよく,どの環境になんのパッケージを入れたかも管理しやすいと思います.またrequirements.txtで複製するケースと比べていつの段階で複製したか(複製先には追加で入れたけど複製元には入れてないケース)を気にする必要がない点もメリットです.

正直毎回グローバル設定するのだるい

執筆中に見つけました.仮想環境のPythonバージョンを指定して作成するにはグローバルのPythonを設定し直さなくてはいけません.いちいちpyenv global [version]と打つのもだるいので,エイリアス登録してしまいましょう.

.zshrc

.zshrc
# alias
alias python3.9="$HOME/.pyenv/versions/3.9.19/bin/python3.9"
alias python3.12="$HOME/.pyenv/versions/3.12.3/bin/python3.12"

とかくだけです.(例によってsource ~/.zshrcを忘れずに)

python3.9.19で仮想環境を作りたければ

python3.9 -m venv [仮想環境名]

とすればOKというわけです.便利ですね.

おまけ

パッケージ追加したくて仮想環境をアクティブにするとき,source ~/venvs/base/bin/activateと打つのもだるいですよね.短いコマンドに変えちゃいましょう.

.zshrc
alias actv_base="source /Users/{username}/venvs/base/bin/activate"

actv_baseと打つだけでbaseがアクティブになります.楽ですね.

その他の参考サイト

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1