pyenvのインストール手順のメモ
システムのpythonのバージョンを変更したり、モジュールの変更をしたりするとシステム上のスクリプトの動作に影響が出る場合があるので、pyenvで個別のpython環境を構築するのがベター。
さらに、virtualenvプラグインを使うと、同じpythonのバージョンでもそれぞれに別のモジュールをインストールできる、仮想環境を構築できる。
なお、pyenvはpythonをバイナリインストールできなくて、ソースからコンパイルするので、インストールにはそれなりに時間がかかる(RasPi2で1~2時間くらい?)。
インストールに必要なモジュールをインストールする。
python-openssl
→ python3-openssl
)
sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git
sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
bluetoothを使用する場合は以下も必要
sudo apt install libbluetooth-dev libglib2.0-dev libboost-python-dev libboost-thread-dev
[!NOTE] 以前、 ubuntuの場合は以下と書いていたが、
libbluetooth3-dev
はlibbluetooth-dev
の別名定義だったので上のコマンドでOKのはず。sudo apt install libbluetooth3-dev libglib2.0-dev libboost-python-dev libboost-thread-dev
pyenv本体とvirtualenvプラグインをインストール。
ついでにupdateプラグインも入れとく。
export PYENV_ROOT=/proj/.pyenv #環境に合わせて修正してね
git clone https://github.com/yyuu/pyenv.git ${PYENV_ROOT}
git clone https://github.com/yyuu/pyenv-virtualenv.git ${PYENV_ROOT}/plugins/pyenv-virtualenv
git clone https://github.com/pyenv/pyenv-update.git ${PYENV_ROOT}/plugins/pyenv-update
pyenvの設定のため、~/.bashrc に以下を追加。
# for pyenv
export PYENV_ROOT=/proj/.pyenv #環境に合わせて修正してね
export PATH=$PYENV_ROOT/bin:$PATH
# 仮想環境名をプロンプトに表示しない場合は以下を有効化
# export VIRTUAL_ENV_DISABLE_PROMPT=1
eval "$(pyenv init --path)" # pyenv 2.0以降で必要
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
Raspbianでは以下も追加
numpyをimportしたとき、undefined symbol: PyFPE_jbuf でエラーになる対策。
参考: https://research.itplants.com/?p=2437
# Raspbian向け対策(numpyでundefined symbol: PyFPE_jbuf)
export PYTHON_CONFIGURE_OPTS="--enable-ipv6\
--enable-unicode=ucs4\
--enable-shared\
--with-dbmliborder=bdb:gdbm\
--with-system-expat\
--with-system-ffi\
--with-fpectl"
Ubuntuでは以下を追加しておく(デフォルトだとShared Library のimportでエラーになる)
export PYTHON_CONFIGURE_OPTS="\
--enable-shared\
"
ここで設定を有効にするためにターミナルを開きなおす。
sudo
でpythonを実行すると、pyenvの設定に関係なくsystemのpythonが実行されてしまいます。
これを防ぐためには、/etc/sudoers
のDefaults secure_path
に以下のpathを追加します。
具体的には以下のように設定します。
# 変更前
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
↓
# 変更後
Defaults secure_path="/proj/.pyenv/plugins/pyenv-virtualenv/shims:/proj/.pyenv/shims:/proj/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
pyenv install --list
pyenv install 3.6.4
・・・ 気長に待つ。 ・・・
pyenv global 3.6.4
念のため指定したバージョンが実行されることを確認
python -V
色々試したあとに、インストールしたモジュールをチャラにしたいときを考えて、仮想環境を構築しておく。
ここでは、python 3.6.4を使用して 仮想環境名 mypython を作成。
pyenv virtualenv 3.6.4 mypython
デフォルトをmypythonに変更する場合は以下を実行
pyenv global mypython
「pipが古い~」と言われる前にバージョンアップ。ついでにsetuptoolsとwheelも。
pip install --upgrade pip setuptools wheel
[!IMPORTANT] ベース環境をバージョンアップしても、仮想環境に引き継がれないので、仮想環境毎に実行が必要。
ディレクトリ毎に使用するバージョンを指定するには(例えば、このディレクトリ下で作業するプロジェクトは3.4.1を使う、みたいな時)
そのディレクトリで以下のように実行する。
指定はそのディレクトリ直下だけでなく、その子ディレクトリ、孫ディレクトリ、・・・で有効。
shellを閉じても設定は残る。
pyenv local <バージョン名 or 仮想環境名>
そのshellだけ使用するバージョンを変更したい場合は、以下のよう実行する。
pyenv shell <バージョン名 or 仮想環境名>
別のターミナルでの実行には影響しない。
RaspberryPi環境で、I2Cを使うためのsmbusモジュールは、通常 sudo apt install python3-smbus
でインストールするが、これだとpyenv環境にインストールできない。
これはsmbus2をインストールして使用することで回避できる。
インストールは以下のように実行する。
pip install smbus2
ちなみに、pyenv 環境へのモジュールのインストールには sudo
は不要。/usr 下へのインストールではないので。
で、プログラムソース側はsmbusのインストール部分を以下のように修正。
try:
import smbus
except ImportError:
import smbus2 as smbus
smbus2 だけにしても良いけど、smbus でも動作できるようにしておくのがベターかな。
pythonの新しいバージョンがリリースされ、それをインストールしたい場合など、pyenvのバージョンアップが必要。
pyenv-updateをインストールしておけば(上記手順でインストール済み)、以下のコマンドですべてのプラグインを含めてバージョンアップしてくれる。
pyenv update
pyenv-updateをインストールしていない場合は以下の手順でそれぞれのリポジトリをpullする。
cd ${PYENV_ROOT}
git pull
cd ${PYENV_ROOT}/plugins/pyenv-virtualenv
git pull
ちょっとだけ使い方一覧。
pyenv [global | local | shell] system
pyenv version
pyenv versions
現在の状態で使用されるバージョンの先頭に「*」 が付く。
pyenv --version
pyenv commands