可変ブログ

色々メモとか。とりあえず自分が分かるように。その後、なるべく人が見て分かるように。可変。

Pythonの周辺環境について整理しながらUbuntuに仮想環境を整える(pipとかvirtualenvとかvenvとか)

Pythonを使おうと思って環境を整えようと思ったのですが、どうも仮想環境というのを導入したほうがいいらしいです。
Pythonはバージョンが2系と3系があり、互換性がないため使い分ける必要があります。
ただ、そのまま何も考えずにPython2とか3を使おうとすると、プロジェクトによって使うモジュールを分けられなかったり、
場合によっては環境を壊してしまう恐れもあるらしいです。(自分はよくわかってないのですが、システムPythonで sudo pip install とかしちゃいけないらしいです。)
そこでPythonの仮想環境というものを作り、それぞれの仮想環境の中でPythonのバージョンや入れるモジュールを構築してやることで、
安全にうまいこと使い分けるができるみたいです。

※後述のバグの為、この記事の通りに進めてもうまくいかないことがあります。
仮想環境作成でエラーが出る人は最初に、『ensurepipが入ってないバグについて』を見てください。


※2018/08/03 追記。
pipenvなるものが登場しました。pipとvenvをいっしょくたにしたようなモジュールのようです。
python自体のバージョンを変えた仮想環境が作れたり、仮想環境の移行がしやすいようになってたりするらしいです。
ですが、さらっとしか見ていないのですが、現状あえてpipenvを使う必要はなさそうな気がします。
Docker file のように構築する環境を記載できるようです。これはいいですね。
詳細は以下。



目次

  • 環境
  • 仮想環境ツールについて
  • Pythonについて
  • pipについて
  • 仮想環境構築
  • ensurepipが入ってないバグについて



環境

  • Ubuntu16.04



仮想環境ツールについて

【どの仮想環境ツールを使うか】

これを見ても分かる通り、仮想環境ツールはたくさんある上に名前がどれも似たり寄ったりでどれを使っていいか全くわかりませんでした。

そこで上も含めここらをざっと調べてみると、virtualenvとvenvと言うのがデファクトスタンダードになっているみたいなのでこれを使っていこうと思います。



【virtualenvとvenvの違い】

virtualenvとvenvの違いについては、上に挙げた記事を見てもらうとなんとなくわかると思いますが、私の理解としてはこんな感じです。

  • virtualenv

仮想環境構築用の『パッケージ』です。apt-get、もしくはpipでインストールできます。
Python2系、3系どちらでも仮想環境を構築できるっぽいです。

  • venv

virtualenvを公式にPython標準『モジュール』として取り入れたものです。Python3.3から導入されました。
そのため機能はvirturalenvとほとんど同じらしいですが、Python2系への切替ができないらしいです。


以上から、2系で使うならvirtualenv、3系で使うならvenvが良いかと思います。
3系もvirtualenvを使えば面倒がない気もしますが、venvが公式なので今後のことも考えこっちを使っておけば間違いないだろうという考えです。


Pythonについて

python python-devのパッケージの違い】

ほとんどの場合Python本体は既にインストールされていると思いますが、
自分でインストールする方法を探してみると、結構いろいろパッケージがあってそれぞれ違いがはっきりしていなかったので調べてみました。
python-devとpython3-devを入れれば事足りそうですね。

sudo apt-get install python          # Python2系最新の本体
sudo apt-get install python-dev      # Python2系最新のヘッダとかライブラリとか(Python2本体に依存、Python2も一緒にインストールされる?)
sudo apt-get install python2         # 存在しない
sudo apt-get install python2-dev     # 存在しない
sudo apt-get install python2.7       # Python2.7本体
sudo apt-get install python2.7-dev   # Python2.7のヘッダとかライブラリとか(Python2本体に依存、Python2も一緒にインストールされる?)
sudo apt-get install python3         # Python3系最新の本体
sudo apt-get install python3-dev     # Python3系最新のヘッダとかライブラリとか(Python3本体に依存、Python3も一緒にインストールされる?)
sudo apt-get install python3.5       # Python3.5本体
sudo apt-get install python3.5-dev   # Python3.5のヘッダとかライブラリとか(Python3本体に依存、Python3も一緒にインストールされる?)

ちなみに2系3系どちらも入れたときに各コマンドで実行されるPythonのバージョンはこのようになっています。

python       # 2.7
python2      # 2.7
python2.7    # 2.7
python3      # 3.5
python3.5    # 3.5

【参考】



pipについて

pipはPython関係のパッケージやモジュールを管理するツールです。
Pythonのバージョンによってそのあり方や、インストール方法が結構変わるので注意してください。

【2系:Python 2.7.8まで、 3系:Python3.3まで】

これらの古めのバージョンではpipはパッケージとして取得するようになっています。
何かの事情がない限り、古いバージョンのPythonをあえて使う人もいないと思うのでこの項目は読み飛ばしていいと思います。
【参考URL】


インストールの方法は2通りあるみたいです。

Python2系

wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py

Python3系

wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py

インストールされるpipはスクリプトを実行するPythonのバージョンに依存するみたいです。

  • 【apt-getでインストールする方法。】
sudo apt-get install python-pip    #Python2系用pip
sudo apt-get install python-pip3   #Python3系用pip


pip公式からインストールしたほうが最新が手に入るみたいですが、apt-getで管理できた方が個人的には気持ちいいです。
まぁ古いバージョンのPythonを使うことはないのでほとんど関係ないですけどね。
使い方は、

pip install hogehoge    #Python2系
pip3 install hogehoge   #Python3系



【2系:Python 2.7.9、 3系:Python3.4以降】

これら新しめのバージョンでは、pipはPythonに同梱されたモジュールとして提供されています。
(だがモジュールとしてインストールされているはずなのに、なぜか普通にpipコマンドとしても使える。謎。)
厳密に言うと同梱されているのではなく、Python3.4から標準モジュールとして追加されたensurepipによって
Pythonインストール時にpipモジュールもインストールされるようになっています。
ですので、Pythonをインストールした段階で一緒にインストールされているので、自分でインストールする必要はないはずです。
が、何か事情があって自分でインストールしたい場合は、

python -m ensurepip

『--upgrade』オプションでpipのバージョンアップもできます。

python -m ensurepip --upgrade


【ensurepipについて参考】


pipモジュールの使い方は

python -m pip install hogehoge     #Python2系
python3 -m pip install hogehoge    #Python3系



仮想環境構築

【virtualenv】

仮想環境の構築方法です。
Python2系の場合はvirtualenvを使います。
【参考】


apt-getでインストールする場合

sudo apt-get install python-virtualenv

pipでインストールする場合

python -m pip install virtualenv


hogehogeディレクトリに仮想環境を構築する場合、

virtualenv hogehoge 
    • system-site-packagesオプションを付けると、グローバルのPython(仮想環境ではないPython)のモジュールを引き継ぎます。


構築した仮想環境に切り替える場合は、

source hogehoge/bin/activate


仮想環境から元に戻るには

deactivate


仮想環境にモジュールを追加する場合は、仮想環境に切り替えた状態でpipを使うだけでOKです。


【venv】

venvはPython3.3以降なら標準で導入されていますのでインストールの必要はないはずです。
使い方は基本的にvirtualenvと同じです。
【参考】


hogehogeディレクトリに仮想環境を構築する場合、

python3 -m venv hogehoge 
    • system-site-packagesオプションを付けると、グローバルのPython(仮想環境ではないPython)のモジュールを引き継ぎます。


構築した仮想環境に切り替える場合は、

source hogehoge/bin/activate


仮想環境から元に戻るには

deactivate


仮想環境にモジュールを追加する場合は、仮想環境に切り替えた状態でpipを使うだけでOKです。

なお、virtualenvもvenvも仮想環境構築時に最新のPythonを入れれば、
ensurepipによってpipモジュールも一緒に仮想環境内にインストールされます。



この仮想環境周辺を図解するとこんな感じでしょうか。

最新Python2でvirtualenvを使った場合。
f:id:shibafu3:20170918120058p:plain



最新Python3でvenvを使った場合。
f:id:shibafu3:20170918115107p:plain


ensurepipが入ってないバグについて

ここまで言っといてなんなんですけど、
Python3.5なのにensurepip標準で入ってねーじゃん!!!
どういうことなの・・・と思ってちょっと調べると、ここに書いてある問題がちょっと近いですかね?
14.04 - pyvenv-3.4 error: returned non-zero exit status 1 - Ask Ubuntu
16.04 - ensurepip is disabled in Debian/Ubuntu for the system python - Ask Ubuntu
Error creating virtualenv with python3.6 · Issue #1059 · pypa/virtualenv · GitHub
んーどうもdebian/ubuntuのバグっぽいですね。Ubuntu14のころからあるみたいなのに直ってないってどういうことですか。

sudo apt-get install python3-venv

とした後に仮想環境を構築すれば、仮想環境内にはensurepipがはいるっぽいですね。
ですが、システムPythonで『python3 -m ensurepip』としてもensurepipがありませんと言われてしまいます。
システムPythonでensurepipが使えないので、pipモジュールもインストールされませんが、
仮想環境を構築するならシステムPythonにpipはいらないのかもしれませんね。
どうしてもインストールしたい場合はapt-getかget-pip.pyでインストールするしかないみたいです。
Pythonモジュールとしてすべてきれいに管理できるのが最新Pythonのイイトコロというか思想なんじゃないかと思ってたのですが・・・
python3-venvやpipだけapt-getで管理ってちょっと気持ち悪いですね。
もっとスマートな方法がありそうなものです。

最後に、このバグの対処法として『sudo apt-get python3-pip』を入れてみてくださいという書き込みも見つけましたが、
これでインストールされるのはpip『パッケージ』であり、公式では推奨されていない(と思う)ものです。
その上ensurepipが入らないので根本解決にはならないと思うので、気を付けてください。
(仮想環境内でもモジュールのpipではなくパッケージのpipを使うのならこれでもいいのかもしれません。正直もうなにがなんだかわからなくなってきました。すべてはensurepipが標準で入っていないせいだ!)



また、別の対処法を発見してしまった。こちらの15ページ目。
パッケージングを支える技術 pyconjp2016
pipはインストールされないものとして、仮想環境構築時に『--without-pip』オプションでpip無しの仮想環境を作ってから、get-pip.pyでpipを仮想環境にインストールするというもの。

もうどれが正解かわからんね。正解とかないのかもね。



Pythonドキュメント