Python execとpython execへのシンボリックリンクのシステムパスは異なります。これにより ModuleNotFoundError が発生します。

Python execとpython execへのシンボリックリンクのシステムパスは異なります。これにより ModuleNotFoundError が発生します。

仮想環境を持つプロジェクトがあります。私のプロジェクト構造は次のとおりです。

$ 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

プロジェクトツリーにスクリプトがありますが、仮想環境を有効にせずにプロジェクトツリーでこのスクリプトを実行したいと思います。pyVenvのPython実行可能ファイルの実際の場所を指すシンボリックリンクがあります。これは、私のPython実行可能ファイルがスクリプトにハードコーディングされず、shebangが含まれている間どこにでもすばやく配布できるようにするためです。

pyこれで、実際のP​​ython実行可能ファイルでシンボリックリンクを呼び出すことは/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-packagesvenvの実際の実行可能ファイルには/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'

どうすれば解決できますか?

関連情報