我的项目结构是:
$ 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']
如您所见,根据是执行 sym-link 还是调用了直接 exec,sys 路径正在发生变化。
例如,符号链接包含/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'