動作確認環境
- Ubuntu 14.04
- Python 2.7.6
- virtualenv 15.1.0
virtualenv ってなんだっけ?
同一マシン(OS)上でありながら、複数のPython環境を作ることができる機能です。
- Python のバージョンを変えたり
- ライブラリを切り替えたり
- 一度作った環境を virtualenv コマンドによって別環境に持って行けたり
ということを、ゼロから作るより圧倒的に早く、数コマンドで実行することができるようになります。初めて触ったときはおっかなびっくりでしたが、とても開発向きの機能です。docker 使えって?
virtualenv 参考
http://cloverrose.hateblo.jp/entry/2012/10/01/235126
http://qiita.com/H-A-L/items/5d5a2ef73be8d140bdf3
http://qiita.com/Kodaira_/items/feadfef9add468e3a85b
sudo python が動かない?
私は普段 Windows 上で Anaconda によりpythonを使用しつつ conda コマンドを経由して virtualenv も使用しているのですが、windows では sudo を要求されるという文化が存在しません。したがって、sudo を要求される 事柄があるということをすっかり忘れていました。
そのとき、私は、bottle という python 用のサーババックエンドプログラムを試そうとしていたのです。
$ virtualenv --no-site-packages bottle_test
$ cd bottle_test
$ pip install bottle
そして、サンプルプログラムをstart_server.py に写経し、実行しようとしました。
$ python start_server.py
...(中略)...
socket.error: [Errno 13] Permission denied
ああ、sudo だな。忘れてた。
$ sudo python start_server.py
...(中略)...
ImportError: No module named bottle
あれ?bottle 入れ忘れてたっけ?そんな馬鹿な?
$ pip freeze
appdirs==1.4.3
bottle=0.12.13
packaging=16.8
pyparsing==2.2.0
six=1.10.0
あー、、あれ?インストールされている、、、なんでエラーになる?
、、、ああ!
原因:sudoしたときに昇格した後 に使えるvirtualenvがない
sudo すると、一時的にではあるがホームディレクトリが /root に切り替わります、そして、/root には virtualenv は作成していません。そう。今作成したのはあくまで、ログイン中のユーザー自身の virtualenv であって、root用のものではない。ということのようでした。
対応?対応。
調べたところ、対応方法は3つほど見つかりました。
- 仮想環境のpythonを直接呼び出す
- sudo で仮想環境を作る
- そもそもsudoが必要なコードを書かない
3 はまあ、、、今回しようとしていることに対して使えないのでおいておきます。
1. 仮想環境のpythonを直接呼び出す
仮想環境を作った時のフォルダ構成に大きく依存しますが、例えば次のように作成したとします
~ $ mkdir test
~ $ cd test
~/test $ virtualenv --no-site-packages testenv
~/test $ cd testenv
~/test/testenv $ source bin/activate
その場合、仮想環境 testenv が使用する python のパスは ~/test/testenv/bin/python
です。
これを直接 sudo で呼び出すと、仮想環境 testenv を使用した状態で python が起動できます。
(testenv) $ sudo ~/test/testenv/bin/python start_server.py
2. sudoで仮想環境を作る
この方法は試していません。考え方としては簡単で、sudoしたときに使用できるvirtualenvを作成しようということのようです。
$ sudo virtualenv venv
この場合、パッケージのインストールは次のようにすればよいようです。
$ sudo venv/bin/pip $PACKAGE
$ sudo sh -c ". venv/bin/activate; pip install $PACKAGE"
sudo + virtualenv の実行参考
https://askubuntu.com/questions/234758/how-to-use-a-python-virtualenv-with-sudo
http://stackoverflow.com/questions/2658902/in-my-virtualenv-i-need-to-use-sudo-for-all-commands
http://emilkirkegaard.dk/en/?p=5770
おわりに
python virtualenv の落とし穴経験共有をさせていただきました。皆様の開発ライフの参考になれば!
え、python使わない?javascriptメインだって?俺だって普段はC#メインだよ!
では!