仮想環境を持つプロジェクトがあります。私のプロジェクト構造は次のとおりです。
$ cd /path/to/project
$ tree . -L 2
.
├── venv
│ ├── bin
│ ├── include
│ ├── lib
│ ├── lib64 -> lib
│ ├── pip-selfcheck.json
│ └── pyvenv.cfg
├── py -> /path/to/project/venv/bin/python3
├── README.md
├── req.txt
└── source
└── sym.py
プロジェクトツリーにスクリプトがありますが、仮想環境を有効にせずにプロジェクトツリーでこのスクリプトを実行したいと思います。py
VenvのPython実行可能ファイルの実際の場所を指すシンボリックリンクがあります。これは、私のPython実行可能ファイルがスクリプトにハードコーディングされず、shebangが含まれている間どこにでもすばやく配布できるようにするためです。
py
これで、実際のPython実行可能ファイルでシンボリックリンクを呼び出すことは/path/to/project/venv/bin/python3
機能しません(詳細は以下を参照)。私が気づいた同伴の症状は、sys.path
値が変更されたことです。フォルダから次のコマンドを実行します/path/to/project/source/
。
$ ls -l ../py
lrwxrwxrwx. 1 som cms-script-admins 45 Apr 17 19:39 ../py -> /path/to/project/venv/bin/python3
$ cat sym.py
import sys
print(sys.path)
$ ../py sym.py
['/path/to/project/source', '/usr/lib64/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/usr/local/lib64/python3.6/site-packages', '/usr/lib64/python3.6/site-packages', '/usr/lib/python3.6/site-packages']
$ /path/to/project/venv/bin/python3 sym.py
['/path/to/project/source', '/usr/lib64/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/path/to/project/venv/lib64/python3.6/site-packages', '/path/to/project/venv/lib/python3.6/site-packages']
[比較を容易にするには、出力の最後の行にスペースを追加します。 ]
ご覧のように、シンボリックリンクを実行するのか、直接実行を呼び出すのかによってシステムパスが変わります。
たとえば、シンボリックリンクにはが含まれていますが、/usr/lib/python3.6/site-packages
venvの実際の実行可能ファイルには/path/to/project/venv/lib/python3.6/site-packages
。
問題の例:セレンをインポートしようとすると、次の結果が表示されます。
$ ../py
>>> import selenium
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'selenium'
どうすれば解決できますか?