pyenvとvenvで仮想環境構築 ラズパイ編

nozzle

pyenv と venv の違い

pyenv は python のバージョンの使い分け。 (e.g. python 2.7.13 と python 3.9.0)
venv は python のパッケージの使い分け。 (e.g. numpy を使う環境 と numpy いらない環境)

pyenv の導入

python のバージョン確認

python -V

僕の場合、2.7.13 でした。これから pyenv で python3.x 系と自由に切り替えられるようにしよう。

導入前に必要なパッケージの導入

sudo apt install build-essential libbz2-dev libdb-dev libreadline-dev libffi-dev libgdbm-dev liblzma-dev libncursesw5-dev libsqlite3-dev libssl-dev zlib1g-dev uuid-dev tk-dev

正直どれがなんだか分からないけど、とにかくlibffi-devは忘れずにインストールしよう。
これが無いと venv の作業でエラーを吐きます。

pyenv のインストール

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
pyenv versions # インストール可能なpythonのバージョンの確認
pyenv install 3.9.0  # 3.9.0が最新(2020/11/09)

[注意] pyenv install 3.9.0 はめちゃめちゃ時間かかるから焦らないように

pyenv の PATH を通す

.bash_profileに以下の内容を追記しよう

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
if [ -f ~/.bashrc ] ; then
      . ~/.bashrc
fi

.bash_profileはログイン時に実行。
.bashrcは bash が開かれる度に実行。

最後の if 文でbashrcを読み込ませる。これが無いと、ssh したときに bash の色が無くなる。
bash の配色はbashrcに担われてるのだ。

参考:ラズパイのセットアップから pyenv を使って Python3.6 環境を構築するまで
参考:本当に正しい .bashrc と .bash_profile の使ひ分け
参考:Ubuntu で色がなくなる理由と改善策

pyenv で 2.x と 3.x を行き来

python -V

python 2.7.13と出るはず

pyenv global 3.9.0
python -V

python 3.9.0と出るはず

pyenv global system

python 2.7.13と出るはず

python2.x と 3.x が混在してるとき、python3.x を使いたいときは python3 とか pip3 とか書く必要があった。
pyenv のおかげで、python と打つだけで python3 系が動くようになった。

venv の導入

venv のインストール

venv はインストールする必要がない

venv は python3.3 から標準機能になったため、pyenv で 3.9.0 を導入しているなら必要がない。

venv の仮想環境の作り方

仮想環境はプロジェクトごとに作られるから、まず作業したいディレクトリを作成して移動しよう。
移動したら次のコマンドを打つ。

python -m venv .venv # [.venv]は適当なフォルダ名

これもちょっと時間がかかる。
仮想環境のフォルダに.venv と書くのは慣習的なもの。
myenvとかでもいいよ。

仮想環境の実行

source .venv/bin/activate

今まで pi@raspberrypi だったやつが、(.venv) pi@raspberrypi になってたら成功。

venv 環境下でのモジュールのインストール

python -m pip install numpy   #numpyのインストール
pip list    #インストールされているモジュールの表示

numpy がリストに加わってるはず。

仮想環境からの離脱

deactivate   # 仮想環境からの離脱
pip list

numpy がリストに無いはず。
それもそのはず、numpy は仮想環境.venv で導入したパッケージだからラズパイの python パッケージには加わっていないのだ。

トラブルシュート:ModuleNotFoundError :No module named ‘_ctypes’

numpy をインストールしてる途中で"ModuleNotFoundError :No module named '_ctypes'と出ることがあった。 libffi-devが無いと出るエラーらしい。しかし、私の場合、導入してもエラーが消えなかった。あれこれ調べたら、pyenv 導入前に libffi-dev がインストールされていないと駄目らしいと判明。

参考:pipenv の install 時に、No module named ‘_ctypes’が発生する

pyenv uninstall 3.9.0
sudo apt install libffi-dev
pyenv install 3.9.0

このあとで numpy の導入を試してみよう。きっとうまくいく。

参考:【Python】venv を使った仮想環境の構築方法