Matthewの備忘録

忘れたときはここを見ろ。何か書いてある。

pyenvとvirtualenvの導入

Pyenvのインストー

 Python2系と3系を両方必要とするため、ディレクトリ毎に実行するPythonバージョンが切り替えられるpyenvと、パッケージのインストールとバージョン管理をディレクトリ毎に行えるvirtualenvを導入することにした。詳しいことは、次のブログに書いてある:
uxmilk.jp
上記ではgitが必要なのでインストールしておく。上記の内容を搔い摘むと:

  1. gitのインストー
  2. pyenvインストーラーの実行(pyenv-installer)
  3. ~/.bash_profileに設定追加
  4. 現在のシェルに設定を反映

実際のコマンド:

$ 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 -)"

~/.bash_profileに設定を追加したらls出力などがおかしくなってしまった場合

 ~/.bash_profileが存在すると、~/.bash_profileを読み込んで~/.bashrcを読み込まなくなる。そこで~/.bash_profileの最終行に次を加えて、~/.bashrcを読み込ませる。

test -r ~/.bashrc && . ~/.bashrc

参考:
qiita.com

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のインストー

追記:
書かないつもりでしたが、書いておくことにした。

 最新版のpyenvをインストールすれば、virturalenvも自動的に使える!

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
$ 

上記は異なるバージョンで試してはいないが、多分できるだろう。

環境が残ってしまう場合

 実は上記のままではpythonがprojectB環境に指定されたままなのでversionsオプションなどを実行させてみたときに警告が出続ける。これを回避するには、まずlocalを指定可能なバージョンに一旦変更し、それからそのディレクトリの.python-versionを削除すればよい。または、local指定した.python-versionがあるディレクトリ要らなければ、そのディレクトリごと削除してしまえばよい(間違ってroot権限で自分のホームディレクトリを消さないように(笑))。

$ pyenv local 3.5.2
$ rm .python-version