Python の venv は activate しなくても使える
はじめに
Python でモジュールをインストールする時はみんな仮想環境を作るんじゃないかと思う。Python の仮想環境をつくる方法はいくつかあるらしいが、Python にわかで複数バージョンを使い分けるほど使い込んでいないのオレの場合 Python 標準のモジュールらしいと聞いたので venv を使っている。
で、その venv であるが、最初に調べた時に「環境作ってから、使う時は activate、使い終わったら deactivate」と書かれていたので今まで何も考えずその通りに使い続けていた。
が、venv で作った仮想環境は activate しなくても使えるということを最近知った。activate しないでどうやって使うのかと言うと、venv/bin/python
を直接起動するだけらしい。
と言う訳で、ちょっと確かめてみた。
なお、以下では起動するのに python3
としているが、これは素の状態では python3
じゃないと起動できなかったので venv でも揃えただけで、それ以上の意味はない。
sys.path を比較してみる
素の状態で python3
まずは venv じゃない素の状態での sys.path
。
$ python3 -c 'import sys; print("\n".join(sys.path))'
/usr/lib/python310.zip
/usr/lib/python3.10
/usr/lib/python3.10/lib-dynload
/usr/local/lib/python3.10/dist-packages
/usr/lib/python3/dist-packages
これが基準。
activate した状態で python3
次に、activate した状態での sys.path
。
$ python3 -mvenv venv
$ . venv/bin/activate
(venv) $ python3 -c 'import sys; print("\n".join(sys.path))'
/usr/lib/python310.zip
/usr/lib/python3.10
/usr/lib/python3.10/lib-dynload
/home/mitsuru/venv/lib/python3.10/site-packages
素の状態に対して /usr/local/lib/python3.10/dist-packages
と /usr/lib/python3/dist-packages
が無くなって、代わりに /home/mitsuru/venv/lib/python3.10/site-packages
が生えた。
これはまぁ想定通り。
activate せずに直接 venv/bin/python3
最後に本命の activate せず直接 venv/bin/python3
を叩いた時の sys.path
。
$ python3 -mvenv venv
$ venv/bin/python3 -c 'import sys; print("\n".join(sys.path))'
/usr/lib/python310.zip
/usr/lib/python3.10
/usr/lib/python3.10/lib-dynload
/home/mitsuru/venv/lib/python3.10/site-packages
お~、確かに activate した時と同じだ。
pip とかも大丈夫らしい
venv/bin/
にいる他のヤツらも直接叩けば activate せずに使えるらしい。特に pip
は当該 venv にインストールしてくれるようだ。
と言うことでみんな大好き numpy
をインストールして確かめてみた。
activate してからインストール
まずは activate してから pip
でインストール。
$ python3 -mvenv venv
$ . venv/bin/activate
(venv) $ pip install numpy
Collecting numpy
Using cached numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.2 MB)
Installing collected packages: numpy
Successfully installed numpy-1.26.4
当然そのままであれば使える。
(venv) $ python3 -c 'import numpy as np; print(np.__version__)'
1.26.4
deactivate すれば使えなくなる。
(venv) $ deactivate
$ python3 -c 'import numpy as np; print(np.__version__)'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'numpy'
activate していない状態でも直接 venv/bin/python3
を起動すれば使える。
$ venv/bin/python3 -c 'import numpy as np; print(np.__version__)'
1.26.4
activate せずにインストール
では、activate せずに install してみる。
$ python3 -mvenv venv
$ venv/bin/pip install numpy
Collecting numpy
Using cached numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.2 MB)
Installing collected packages: numpy
Successfully installed numpy-1.26.4
どっかにインストールされた。
そのまま activate せずに使ってみる。
$ venv/bin/python3 -c 'import numpy as np; print(np.__version__)'
1.26.4
ちゃんと使えた!
もちろん、素の python3
だとダメだ。
$ python3 -c 'import numpy as np; print(np.__version__)'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'numpy'
activate せずに install したものでも activate してから使える。
$ . venv/bin/activate
(venv) $ python3 -c 'import numpy as np; print(np.__version__)'
1.26.4
なるほど~
ドキュメントにちゃんと書いてあった…
調べたら venv のドキュメントにちゃんと書いてあった…
You don’t specifically need to activate a virtual environment, as you can just specify the full path to that environment’s Python interpreter when invoking Python. Furthermore, all scripts installed in the environment should be runnable without activating it.
適当訳:仮想環境の Python のフルパスを指定すれば、別に activate しなくても大丈夫だよ。仮想環境のスクリプトも activate しないで使えるはずだよ。
ドキュメントって重要…
ところで Python の仮想環境ってのはみんなそんなもんなんかね?(他は使ったことない
Discussion