け い ざ ん の D I Y 工 房

◆Home
◆住まいの D I Y
◆パソコン D I Y
◆ROBOT D I Y
◆電子工作 D I Y
◆Science

● 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


----------------------------------------------------------------------------------------------------------------------------
・けいざん美術館
・Blog 油絵もろもろ
・EXCEL VBAであくせく
・けいざんの食べログ


                 Site Designed by Kasio Keizan