root権限が無いサーバー(Ubuntu16.04)でPython環境を作る際、仮想環境に悩んだのでまとめておきます。導入の解説は無いのでご理解ください。
1日目 virtualenvの導入
まず候補に挙げたのが、pyenvとvirtualenvです。それぞれの主な利点・欠点は,
- pyenv
- 利点 : 初めに設定すれば、以後ディレクトリに入るだけでバージョンが切り替わる
- 欠点 : 複数のPythonバージョンを切り替えて使えるが、同一のバージョンで複数の環境が作れない
- virtualenv
- 利点 : 同一のバージョンで環境をいくらでも作れる
- 欠点 : 環境の切り替え時にいちいち
activate/deactivate
するのが面倒
pyenvはactivate
する手間が無い分楽ですが、同じPythonのバージョンで複数の環境が作れない以上どうしても仮想環境一個一個が大きくなってしまいます。
出来るだけミニマルで、要らなくなったら気軽に消せるような仮想環境が欲しかったためvirtualenvを選びました。
また、virtualenvと全く同じ動作を実現するvenvというものがPython3以上から標準化されていますが、手元にPython2で書かれたプロジェクトがあるため今回はvirtualenvにしました。
2日目 めんどくさい
さて、virtualenvを入れてクリーンな環境作りを、と思っていたのですが問題が起こりました。
virtualenvはpyenvと違い、Pythonそのものは自前で用意する必要があります。
$ apt install python3.6
sudo権限が無いので上記のようなコマンドは使えず、通常
$ wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
$ ./configure --prefix=$HOME/usr
$ make
$ make install
このようにソースからインストールしなければなりません。面倒だ。
また、sqlite3などのモジュールが無い場合、モジュールをインストール後一度Pythonそのものを入れ直す必要があります。
apt-get remove python3
sudoがあればこの一言で消せる(らしい)のですが、あいにくapt系は一切使えません。インストール時、自分のローカル$HOME/usr
とかを指定していたならば、そこに入って関係のあるファイルを一個一個探して消す必要があります。こうなるととっても面倒です。
※かなり憶測が含まれます。別に消さなくても再インストールで上書きすればいいんじゃ?という気もしますがあいにくやったことないから分からない。とりあえずPythonの削除が手間だというのは恐らく正しいです。
この削除問題は、インストール時にPythonバージョン毎にディレクトリを分ければ解決できます。
$ wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
$ ./configure --prefix=$HOME/usr/python3.6.9
$ make
$ make install
これで消したいときは
rm -r $HOME/usr/python3.6.9
で一発です。
さて削除は楽になりましたが、インストールが一々めんどくさい…それにもしミスって$HOME/usr
直下にインストールしたら削除するのが大変だし、sudo権限が無くても簡単にPythonを導入・削除できるバージョン管理ツールは無いものか…
3日目 pyenvの導入
ありました。pyenvです。
インストール
pyenv install 3.6.9
アンインストール
pyenv uninstall 3.6.9
簡単にPythonを入れたり消したりできます。
インストールしたPythonは
$HOME/.pyenv/versions/
に置かれることになります。つまり
virtualenv $hoge/env_py3.6 --python=$HOME/.pyenv/versions/3.6.9/bin/python3.6
このように、pyenvで入れたPythonからvirtualenvが仮想環境を作成するというコンビネーションが可能になります。
終わりに
斯くして、Pythonの導入はpyenvに任せ、仮想環境はvirtualenvで作るというスタイルに落ち着いたのでした。
他にも、pyenv-virtualenvという元々ハイブリッドになってるやつがあるらしく気になっています。ただ、これはactivate/deactivate
しないでいい代償にかなり重いと聞いたので、とりあえずはこのまま使ってみます。
7/28追記
pipenvなる便利ツールがあり、今はpyenv+pipenvのような運用が流行っているそうです…
全然知らなくってまだvirtualenvとの違いが分かっていないので色々調べて試してみます。