python - 虚拟环境下python 3.8如何构造sys.path?
问题描述
当我检查sys.path
我的 python3.8 虚拟环境时,我注意到一些奇怪的事情。具体来说,我的 中有以下层次结构playground
:
.
├── mmdetection
├── monodepth2
├── py37
├── py38
└── qd-track
当我调用 python 环境py38
并查看sys.path
成员时,我注意到以下模式:
dian@ubuntu:~/playground$ ls
mmdetection monodepth2 py37 py38 qd-track
dian@ubuntu:~/playground$ source py38/bin/activate
(py38) dian@ubuntu:~/playground$ python
Python 3.8.0 (default, Oct 28 2019, 16:14:01)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/dian/playground/py38/lib/python3.8/site-packages', '/home/dian/playground/mmdetection', '/home/dian/playground/py38/lib/python3.8/site-packages/terminaltables-3.1.0-py3.8.egg', '/home/dian/playground/py38/lib/python3.8/site-packages/mmpycocotools-12.0.3-py3.8-linux-x86_64.egg', '/home/dian/playground/qd-track', '/home/dian/playground/py38/lib/python3.8/site-packages/motmetrics-1.2.0-py3.8.egg', '/home/dian/playground/py38/lib/python3.8/site-packages/mmcv-1.1.5-py3.8-linux-x86_64.egg', '/home/dian/playground/py38/lib/python3.8/site-packages/xmltodict-0.12.0-py3.8.egg', '/home/dian/playground/py38/lib/python3.8/site-packages/scipy-1.5.3-py3.8-linux-x86_64.egg', '/home/dian/playground/py38/lib/python3.8/site-packages/pytest_benchmark-3.2.3-py3.8.egg']
有趣的是,mmdetection
与qd-track
处于同一级别的 和,被、while和py38
weren 拾取。我将名称更改为,并创建了几个新的空文件夹, ,这使当前文件夹看起来像:sys.path
monodepth2
py37
mmdetection
mmdetection2
detectron
detectron2
.
├── detectron
├── detectron2
├── mmdetection2
├── monodepth2
├── py37
├── py38
└── qd-track
然后我尝试再次打印 sys.path ,并得到:
(py38) dian@ubuntu:~/playground$ python
Python 3.8.0 (default, Oct 28 2019, 16:14:01)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/dian/playground/py38/lib/python3.8/site-packages', '/home/dian/playground/detectron2', '/home/dian/playground/py38/lib/python3.8/site-packages/terminaltables-3.1.0-py3.8.egg', '/home/dian/playground/py38/lib/python3.8/site-packages/mmpycocotools-12.0.3-py3.8-linux-x86_64.egg', '/home/dian/playground/qd-track', '/home/dian/playground/py38/lib/python3.8/site-packages/motmetrics-1.2.0-py3.8.egg', '/home/dian/playground/py38/lib/python3.8/site-packages/mmcv-1.1.5-py3.8-linux-x86_64.egg', '/home/dian/playground/py38/lib/python3.8/site-packages/xmltodict-0.12.0-py3.8.egg', '/home/dian/playground/py38/lib/python3.8/site-packages/scipy-1.5.3-py3.8-linux-x86_64.egg', '/home/dian/playground/py38/lib/python3.8/site-packages/pytest_benchmark-3.2.3-py3.8.egg']
这一次,mmdetection2
消失了,detectron2
没有被捡起来detectron
。这太奇怪了,因为路径似乎是由 python 动态检测到的,而不是从某些固定索引中读取的。究竟如何检测它们让我感到困惑。我检查PYTHONPATH
了,它是空的。
更有趣的是,我尝试切换到与py37
并排放置的环境,但py38
没有发生上述任何情况:
(py38) dian@ubuntu:~/playground$ deactivate
dian@ubuntu:~/playground$ source py37/bin/activate
(py37) dian@ubuntu:~/playground$ python
Python 3.7.5 (default, Nov 7 2019, 10:50:52)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/home/dian/playground/py37/lib/python3.7/site-packages', '/home/dian/playground/py37/lib/python3.7/site-packages/terminaltables-3.1.0-py3.7.egg']
那么,我想这可能是由于从 python3.8 开始对加载机制的一些新变化?而且,当我使用 sys.path 时,我应该期待什么行为?官方文档没有给出要包含在 sys.path 中的项目的确切列表。
顺便说一句,我使用的是 Ubuntu 18.04.3 LTS;py37
并py38
通过 virtualenv 创建。
解决方案
推荐阅读
- opengl - 如何在 OpenGL 片段着色器中创建闪烁效果?
- server - Raspberry PI 如何在文件夹上挂载 webserver 目录
- reactjs - 使用 Hooks 在 React 中处理错误和显示消息的正确方法
- php - Laravel Slack 通知的奇怪行为
- r - 如何为分组数据图添加平均线
- android - 看这个“startActivityForResult()”代码,这个函数被弃用了。如何在片段中更改此代码?
- ios - 使用 numberOfTouchesRequired 实现与 TrackPad 的二次点击
- android - java.lang.Object android.content.Context.getSystemService(java.lang.String) 错误
- firebase - 如何获取 Firebase 动态链接 URL 社交元数据本身
- python - 不同屏幕上的窗口变化