てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Python] システムワイドのパッケージを利用できるように venv を作成するオプション --system-site-packages

はじめに

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さん、ありがとうございました。

パスやバージョンもあわせて確認

ありがとうございます。

(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