● RaspberryPi4B pyenv pyenv-virtualenvで仮想環境の構築
2022.01.16
Programを動作させる環境が Main環境だけの場合は、OpenCVや Tensorflow
などのVersionの違う Programを installして環境を作り変えした場合。
これにより関連する numpy などの Programも Versionが変更されている事に
気づかずハマッてしまう事がたびたびあります。
これを避けるには、仮想環境を構築するしかありません。
仮想環境を作るには、pyenv, pyenv-virtualenv, venv, Anaconda, Pipenv
などの Toolがたくさんあります。どれを使ったらいいのか迷ってしまいます。
これは過渡期の状態であり、そのうち自然淘汰されて使いやすい Toolが残って
いくという状態にまでなっていない様です。
仮想環境を作り pythonを切替えるには、ここでは RasPiに標準搭載の venvと
pyenv, pyenv-virtulenvを使用します。
【install 環境】
・RasPi ・RAM ・O S ・SSD ・Hard ・Camera ・python |
RaspberryPi 4B 4 GB RaspberryPi (buster) armv7l 32bit Ver.10 micro SD 64GB SunFounder PiCar-4WD kit RaspberryPi Camera module local: python3.6.15 global: 3.8.9 system: 3.9.2 |
【pyenv の install】
$ cd /home
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install -y git libffi-dev openssl libopencv-dev libssl-dev zlib1g-dev liblzma-dev tk-dev libbz2-dev libreadline-dev libsqlite3-dev build-essential
$ git clone https://github.com/pyenv/pyenv.git /home/.pyenv
installが終わったら、home/pi配下の .bashrcに下記4行を追加します。
$ cd /home/pi
$ ls -l -a
$ sudo nano .bashrc
.bashrc
export PYENV_ROOT="/home/.pyenv"
export PATH="/home/.pyenv/bin:/home/.pyenv/shims:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
PATHの指定は internetにあふれている書き方では Errorになりました。
ここでは .pyenv/bin と .pyenv/shims の両方の Folderを検索する
設定にしています。
PATHは先に binを検索しますが、.pyenv/binには pyenvしか入っていないので、
その後 pip, python, pyenv などが入った .pyenv/shimsを検索する設定にします。
【仮想環境の作成】
まず、「Virtual」という仮想環境用の Directoryを作成します。
そして、/home/pi/Virtualの python version表示
$ mkdir Virtual
$ cd Virtual
$ pyenv versions
$ python -V
python 3.9.2
仮想環境の作成は、Mainの環境の python Versionが仮想環境に反映されるので
まず Main環境側で準備をします。
仮想環境に必要な python versionを Mainの環境に installします。
Tensorflow の都合で仮想環境に python-3.6.15 を作成します。
$ cd /home/pi/Virtual
$ pyenv install 3.6.15
知らないで作成すると system versionと同じ versionを仮想環境に作ってしまいます。
installが終わったら pyenvで local設定して固定します。
その後、python versionの確認を行います。
Main環境を python-3.6.15に固定した状態で venvで py36envという
Folderを作成して python3.6.15環境を構築します。
$ cd /home/pi/Virtual
$ python3 -m venv py36env ・・・py36env Folder作成
いきなりErrorが出ます。
$Error: Command '['/home/pi/Virtual/py36env/bin/python', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.
「.」 command又は「source」で 「py36env」 Directoryにある bin/activateを
実行してみると「py36env/bin」の下に activateがありませんの Errorになり仮想環境に入れません。
下記を installすれば解決するとあったのでやってみます。
$ sudo apt-get install python3-venv
下記の様に出力 messageは、すでにinstall 済みと出てきます。
pi@raspi04:~/Virtual $ sudo apt-get install python3-venv
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています。
状態情報を読み取っています... 完了
python3-venv はすでに最新バージョン (3.7.3-1) です。
ここで「--without-pip」commandを使用します。
$ python3 -m venv --without-pip venv
py36env/bin の下に activateができました。
【仮想環境への切り替え】
「.」 command又は「source」で 「py36env」 Directoryにある bin/activate を実行すれば仮想環境に 入れます。
$ cd /home/pi/Virtual/py36env
$ . bin/activate
(py36env) $ ⇒ここから仮想環境で実行中になる。
whichで pythonの directory tree を確認してみると、pythonは仮想環境になったが、
pipがMainの Local環境のままになっています。
pi@raspi04:~/Virtual $ which python
/home/pi/.pyenv/shims/python
pi@raspi04:~/Virtual $ which pip
/usr/local/bin/pip
仮想環境に pip を install します。
$ . bin/activate
(py36env)$ cd py36env/lib
$ curl -sSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python get-pip.py
一旦仮想環境を抜けて、再度仮想環境に入ると、pipの Pathが確認できます。
仮想環境に pipが作成されました。
(py36env)$ which pip
/home/pi/.pyenv/shims/pip
【仮想環境の終了】
(py36env) $ deactivate
$ ⇒ここから通常モード
【仮想環境の pythonを変更する】
仮想環境の python変更手順
仮想環境で使用する pythonの installから始めます。
$ cd /home/pi/Virtual/py36env
$ . bin/activate
(py36env)$ pyenv install --list ・・・install可能なlist表示
Available versions
ーーーー ーーーーーー
・・・
3.7.12
・・・
3.8.12
・・・
3.10.2
(py36env)$:
list表示された versionの中から python3.7.12を installします。
(py36env)$ pyenv install 3.7.12 ・・・python 3.7.12 install
Downloading python-3.7.12.tar.xz・・・
この仮想環境 Folderに version3.7.12を pyenv localで設定してみます。
pyenv versionsで確認すると 3.7.12になっていますが、
仮想環境を python -Vで確認すると python 3.6.15になっています。
この仮想環境 Folderは、version 3.6.15用として作成したので変化しないのです
/bin Folderには python 3.6.15の PATHしかありません。
pyenv localで version指定を行うとその Folderは globalより優先してlocal versionが使用されます。
優先順位: shell > local > global
(py36env)$ pyenv local 3.7.12 ・・・python 3.7.12の local固定
(py36env)$ pyenv versions ・・・現在使用中の python version表示
system
*Python 3.7.12
pyenv localを指定すると、カレントDirectoryに、.python-versionという
Fileが作成されます。内部は pythonの versionだけが書かれています。
local設定を解除する場合。
$ pyenv local --unset
【pyenv-virtualenvの install】
pyenv-virtualenvは、pyenvの pluginであり Folder作成や Python名を単なる番号
だけでなく、文字で表現できる様にします。
まず、githubから cloneしてきます。
$ cd /home
$ git clone https://github.com/pyenv/pyrnv-virtualenv.git /home/.pyenv/plugins/pyenv-virtualenv
Downloadが終わったら、/home/pi/.bashrcに下記を書き込みます。
export PATH="/home/.pyenv/plugins/pyenv-virtualenv/bin:$PATH"
export PYENV_VIRTUALENV_DISABLE_PROMPT=1
eval "$(pyenv virtualenv-init -)"
仮想環境を文字列で作成して local commandで固定してみましょう。
ここでは PINTOさんからもらう TensorflowLite-bin Folder用に versionが
python 3.7.12で、名称が tfrecord という local python番号環境を作成します。
$ cd /home/pi/Virtual/py36env
$ pyenv virtualenv 3.7.12 tfrecord
作成した仮想環境の中の python versionを確認をすると
$ pyenv versions
*system
3.7.12
3.7.12/envs/tfrecord
3.8.12
tfrecord
3.7.12/envs/tfrecordと、tfrecordの2つの versionができました。
実態は1つであり、どちらを使用してもかまわない様です。
TensorflowLite-binを Downloadして Directoryを作成します。
作成した Directoryに入って python3.7.12を tfrecordという名称で固定します。
$ cd TensorflowLite-bin
$ pyenv local tfrecord
「Error 許可がありません。」 この Errorが出てきて local指定できません。
このErrorは local環境内の python vesionを管理者以外が勝手に変更できない様に
/home/pi/.pyenv/versionの owner権限を rootに設定しています。
自分しか使用しないので owner権限の neme&Groupを root:rootから pi:piに変更します。
$ sudo chown -hR pi:pi /home/pi/.pyenv
$ cd TensorflowLite-bin
$ pyenv local tfrecord
作成した仮想環境の中の python versionを確認をすると
$ pyenv versions
system
3.7.12
3.7.12/envs/tfrecord
3.8.12
*tfrecord
これで仮想環境の pythonを version 3.7.12で名称 tfrecordに、固定する事ができました。
【仮想環境のpython削除】
今まで使用していた仮想環境の pythonが不要になったら venvで clearします。
後で再度使用したい場合は、requirement.txtを作成してください
(py36env)$ pip freeze > requirement.txt #requirement.txtを作成
$ cd /home/pi/Virtual
$ python -m venv py36env --clear
$ cd /home/pi/Virtual/py36env
$ pyenv versions
*system
【global環境のpython設定】
RaspberryPi全体で使用する pythonの versionは、global設定します。
$ cd /home/pi
$ pyenv global 3.7.12
pyenv globalを指定すると、カレントdirectoryに、HOME/.pyenv/versionが作成されます。
内部には、python version数値だけが書かれている。
これでどの Folderに移動しても versionの同じ pythonが使用できます。
全体を systemの versionに戻したい場合は下記の様にします。
$ pyenv global system
----------------------------------------------------------------------------------------------------------------------------