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

我在项目目录树中有脚本,我想在项目目录树中运行这些脚本而不激活虚拟环境。我有一个符号链接 ,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']

[在输出的最后一行添加空格以方便比较。]

正如您所看到的,根据是执行符号链接还是调用直接 exec,系统路径正在发生变化。

例如,符号链接包含/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'

我该如何解决?

相关内容