LoginSignup
9
14

More than 5 years have passed since last update.

virtualenv を使っているときに sudo pythonして動かなくて困惑した私へ

Posted at

動作確認環境

  • 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 用のサーババックエンドプログラムを試そうとしていたのです。

bottleインストールまで
$ 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で実行
$ 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つほど見つかりました。

  1. 仮想環境のpythonを直接呼び出す
  2. sudo で仮想環境を作る
  3. そもそもsudoが必要なコードを書かない

3 はまあ、、、今回しようとしていることに対して使えないのでおいておきます。

1. 仮想環境のpythonを直接呼び出す

仮想環境を作った時のフォルダ構成に大きく依存しますが、例えば次のように作成したとします

virtualenvの作成
~ $ 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をつくる
$ 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#メインだよ!
では!

9
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
14