我有一个带有虚拟环境的项目。我的项目结构是:
$ 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'
我该如何解决?