🐔

Python の venv は activate しなくても使える

2024/03/29に公開

はじめに

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