はじめに
venv はデフォルトでは、システムワイド(グローバル、OSレベル)な Python 環境を参照しません。
venv 作成時に --system-site-packages
オプションを参照するようになります。
これにより、venv にないパッケージでもシステムワイドに入っていれば venv から使えるようになります(個人的には使ったことありませんが)。
デフォルトの場合と--system-site-packages
オプション不可時の挙動をそれぞれ確認します。
- 動作確認環境: Python 3.6.8
デフォルト
特に特別なオプションを指定せずに venv を作成します。
システムワイドにのみ paramiko
をイントールした状態で、paramiko
を import しようとするとエラーになります、
[admin@gitlab ~]$ python3 -m venv venv1 [admin@gitlab ~]$ source venv1/bin/activate (myvenv) [admin@gitlab ~]$ (myvenv) [admin@gitlab ~]$ python -c "import paramiko" Traceback (most recent call last): File "<string>", line 1, in <module> ModuleNotFoundError: No module named 'paramiko'
--system-site-packages
オプション付加
--system-site-packages
オプションを付加して venv を作成します。
今度は paramiko
が import できました。
[admin@gitlab ~]$ python3 -m venv venv2 --system-site-packages [admin@gitlab ~]$ source venv2/bin/activate (venv2) [admin@gitlab ~]$ python -c "import paramiko" (venv2) [admin@gitlab ~]$
参考
知ったきっかけ
--system-site-packages
オプションは、Software Design 2021年2月号の連載「Ansible問題解決マップ」の
「Ansibleの実行環境」で知りました。
著者の@saito_hidekiさん、ありがとうございました。
パスやバージョンもあわせて確認
ありがとうございます。
こういうので確認するのもよいです😇
— すぎむら (@sugitk) 2021年4月11日
python -c "import paramiko; print(paramiko.__file__); print(paramiko.__version__)"
(venv2) [admin@gitlab ~]$ python -c "import paramiko; print(paramiko.__file__); print(paramiko.__version__)" /usr/local/lib/python3.6/site-packages/paramiko/__init__.py 2.7.2