はじめに
研究に用いていたubuntu16.04で,ディレクトリごとにpython3.7.3の環境を切り替えられるようにした.
意外とハマるポイントが多かったので,備忘録のためにもまとめておく.
章立ては以下の通り.
- pyenvのインストールをする
- pyenv-virtualenvのインストール
- sudo pyenvを使えるようにする
- pyenvのバージョン切り替えが反映されない時の対処法
- matplotlibで図が描画できない問題
各項目についての詳細は,参考のリンクに飛んだほうが分かりやすいかも.
pyenvのインストール
githubからリポジトリをcloneしてくる.
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
.bashrcに以下を追記し,pathを通す.
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
さらに,.bashrcを再度読み込むことで設定を適用.
source ~/.bashrc
pyenv-virtualenvのインストール
pyenvだけでは,同一バージョンで複数のpython環境を管理することができない.
具体的には,python3.7.3とpython3.5.2を分けて管理することは可能だが,同じpython3.7.3の環境を別々に管理することはできないという問題がある.
そのため,pyenv-virtualenvをインストールし,python3.7.3の環境をディレクトリごとに切り替えられるようにする.
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
さらに,.bashrcに以下を追記する.
eval "$(pyenv virtualenv-init -)"
ここで.bashrcを再度読み込んでおく.
source ~/.bashrc
sudo pyenvを使えるようにする
sudoする時のpathが引き継がれず,$sudo pyenv
でエラーを吐くことがある.
$sudo visudo
で設定ファイルを以下のように編集する.
# Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin コメントアウト
Defaults env_keep += "PATH" # 追加
Defaults env_keep += "PYENV_ROOT" # 追加
pyenvのバージョン切り替えが反映されない時の対処法
.bashrcに以下を追記することで解決できる.
export PATH="$HOME/.pyenv/shims:$PATH"
これでディレクトリごとの環境切り替えができるようになったはずなので,簡単にpyenv-virtualenvの使い方を書く.
まず,必要になるツールをインストールしておく.
sudo apt install -y gcc make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
python3.7.3をインストールする.
sudo pyenv install 3.7.3
新しい環境sample
を作成する.
sudo pyenv virtualenv 3.7.3 sample
当該ディレクトリに環境を適用.
sudo pyenv local sample
正しく適用されているかどうかは,$sudo pyenv versions
で確認できる.
matplotlibで図が描画できない問題
python3.7.3で,matplotlibで図を描画しようとすると以下のようなエラーメッセージが出ることがある.
UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
この方法が最適かどうかは微妙だが,GUIをPyQtに変更すると描画できるようになる.
まず,PyQt5をpython環境にインストールする.
sudo pip install PyQt5
さらに,matplotlibのmatplotlibrcファイルの該当箇所を以下のように書き換える.
backend: Qt5Agg
これでmatplotlib.pyplot.show()で描画できるようになる.