Как python 3.8 в виртуальной среде создает sys.path?

#python #python-3.x #virtualenv #sys.path

#python #python-3.x #virtualenv #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 , которые находятся на том же уровне py38 , были подобраны 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.

Комментарии:

1. Кроме того, пожалуйста, всегда используйте общий тег [python] для всех вопросов, связанных с python