pyenvとvirtualenvの導入
Pyenvのインストール
Python2系と3系を両方必要とするため、ディレクトリ毎に実行するPythonバージョンが切り替えられるpyenvと、パッケージのインストールとバージョン管理をディレクトリ毎に行えるvirtualenvを導入することにした。詳しいことは、次のブログに書いてある:
uxmilk.jp
上記ではgitが必要なのでインストールしておく。上記の内容を搔い摘むと:
実際のコマンド:
$ sudo apt-get install git $ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile $ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile $ exec $SHELL -l
pyenv-installerを実行すると以下を実行するように言われるが、PYENV_ROOTを設定したほうがスマートであろう。また、後で書き残しておくつもりであったvirtualenvまで設定してしまっているが、どうせ導入するのだから、ここで設定してしまおう。
# Load pyenv automatically by adding # the following to ~/.bash_profile: export PATH="/home/matthew/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"
Pyenvの使い方
使い方は次のサイトを参考にした:
qiita.com
インストール可能なリストを得る
インストール可能なバージョン一覧の確認をすると、沢山表示されるので、Pythonそのものの利用可能なバージョンだけを表示させてみる:
2系だけを出力させたい場合 $ pyenv install --list | grep '^ 2' 3系だけを出力さえたい場合 $ pyenv install --list | grep '^ 3'
指定のバージョンをインストール
とりあえず、最新の3系3.5.23.6.1をインストールし、利用できるバージョンを確認する。
$ pyenv install 3.5.2 ・・・ WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib? WARNING: The Python readline extension was not compiled. Missing the GNU readline lib? WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib? ・・・ $ pyenv versions * system (set by /home/matthew/.pyenv/version) 3.5.2
警告が出ることがあるが、ライブラリがないだけなので、必要あれば、ライブラリをapt-getなどを使ってインストールしてから、再度インストールしなおせばよいと思う(試してないけど、多分そうだろう。後ほどためしてみるか)。systemはpyenvを利用する前にインストールされていた2系のPythonである(システムによってバージョンは異なるだろう)。
追記:
上記は3.5.2でしたが、追記したときの最新版は3.6.1です。Pythonをビルドするのに必須なパッケージが適切にインストールされていれば上記のようなパッケージに関する警告は表示されません。
ライブラリがなくてインストールが失敗するとき
追記:
ビルドするのにパッケージが足りない時は次のコマンドでパッケージをインストールしてからビルドするとよい。
$ sudo apt-get install libbz2-dev libncurses5-dev libgdbm-dev liblzma-dev libsqlite3-dev tk-dev libreadline-dev libssl-dev
記事によっては次のようにバージョンを指定しているものがありますが、作りたいPython環境に合わせたパッケージを選ぶとよい:
$ sudo apt-get install zlib1g-dev bzip2 libbz2-dev libreadline6-dev libjpeg62 libjpeg62-dev libsqlite3-0 libsqlite3-dev libgdbm3 libgdbm-dev libssl1.0.0 libssl-dev tk8.4-dev tk8.5-dev tk8.6-dev
上記インストールパッケージの内訳:
モジュール | パッケージ名 |
---|---|
zlib, gzip | zlib1g-dev |
bz2 | bzip2, libbz2-dev |
readline | libreadline6-dev |
jpeg | libjpeg62, libjpeg62-dev |
sqlite3 | libsqlite3-0, libsqlite3-dev |
gdbm, dbm | libgdbm3, libgdbm-dev |
ssl | libssl1.0.0, libssl-dev |
Tk系 | tk8.4-dev, tk8.5-dev |
最近のではない資料、記事などではlibssl0.9.8であることが多いが、ハートブリード事件以降1.0.1g以降にすることが推奨された。しかしUbuntuのパッケージは1.0.0である。例の脆弱性は1.0.1で混入したので、1.0.0でも問題はないはず(調査中)。
参考:
ymotongpoo.hatenablog.com
www.huffingtonpost.jp
ハートブリード - Wikipedia
www.saintsouth.net
インストールされているバージョンの確認方法
デフォルトで利用されるバージョンを設定するにはglobalコマンド、確認するにはversionとversionsを利用する:
$ pyenv versions * system (set by /home/matthew/.pyenv/version) 3.5.2 $ pyenv global 3.5.2 $ pyenv versions system * 3.5.2 (set by /home/matthew/.pyenv/version) $ pyenv global system $ pyenv versions * system (set by /home/matthew/.pyenv/version) 3.5.2 $ pyenv version system (set by /home/matthew/.pyenv/version) $ pyenv global 3.5.2 $ pyenv version 3.5.2 (set by /home/matthew/.pyenv/version) $
特定のディレクトリ以下を指定のバージョンにする
$ cd PROJECT_DIR $ pyenv local 2.7.11 $ pyenv version Python 2.7.11 $ cd .. $ pyenv version Python 3.5.1
Virtualenv
既にインストールされ、設定も済んでいるので、使い方のみ。
参考:
uxmilk.jp
Virtualenvの使いかた
Pythonのバージョンとパッケージ環境名を指定 $ pyenv virtualenv 3.5.2 projectA Ignoring indexes: https://pypi.python.org/simple Requirement already satisfied (use --upgrade to upgrade): setuptools in /home/matthew/.pyenv/versions/3.5.2/envs/projectA/lib/python3.5/site-packages Requirement already satisfied (use --upgrade to upgrade): pip in /home/matthew/.pyenv/versions/3.5.2/envs/projectA/lib/python3.5/site-packages 実験のため、同様にもう一つ用意してみる $ pyenv virtualenv 3.5.2 projectB Ignoring indexes: https://pypi.python.org/simple Requirement already satisfied (use --upgrade to upgrade): setuptools in /home/matthew/.pyenv/versions/3.5.2/envs/projectB/lib/python3.5/site-packages Requirement already satisfied (use --upgrade to upgrade): pip in /home/matthew/.pyenv/versions/3.5.2/envs/projectB/lib/python3.5/site-packages カレントディレクトリ以下をprojectAのバージョンとパッケージ環境にする matthew@LUKE:~$ pyenv local projectA そしてアップグレード (projectA) matthew@LUKE:~$ pip install --upgrade pip Collecting pip Using cached pip-9.0.0-py2.py3-none-any.whl Installing collected packages: pip Found existing installation: pip 8.1.1 Uninstalling pip-8.1.1: Successfully uninstalled pip-8.1.1 Successfully installed pip-9.0.0 requestsパッケージをインストールしてみる (projectA) $ pip install requests Collecting requests Downloading requests-2.11.1-py2.py3-none-any.whl (514kB) 100% |████████████████████████████████| 522kB 2.1MB/s Installing collected packages: requests Successfully installed requests-2.11.1 インストールされているパッケージを表示させてみる (projectA) $ pip list DEPRECATION: The default format will switch to columns in the future. You can use --format=legacy (or define a list_format in your pip.conf) to disable this warning. pip (9.0.0) requests (2.11.1) setuptools (20.10.1) カレントディレクトリ以下をprojectBのバージョンとパッケージ環境に変更してみる (projectA) $ pyenv local projectB インストールされているパッケージを表示させてみる (projectB) $ pip list pip (8.1.1) setuptools (20.10.1) You are using pip version 8.1.1, however version 9.0.0 is available. You should consider upgrading via the 'pip install --upgrade pip' command. projectA環境をアンインストールしてみる (projectB) $ pyenv uninstall projectA pyenv-virtualenv: remove /home/matthew/.pyenv/versions/3.5.2/envs/projectA? y projectB環境をアンインストールしてみる (projectB) $ pyenv uninstall projectB pyenv-virtualenv: remove /home/matthew/.pyenv/versions/3.5.2/envs/projectB? y $
上記は異なるバージョンで試してはいないが、多分できるだろう。