当我检查python3.8虚拟环境中的sys.path
时,我注意到一些奇怪的事情。具体来说,我的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
的名称更改为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 LTSpy37
和py38
是通过virtualenv创建的
目前没有回答
相关问题 更多 >
编程相关推荐