Я опишу основной процесс, который я узнал из презентации @jcollado, с которой связан.
Когда Python запускается, он смотрит на путь двоичного файла и его префиксы.
Итак, допустим, ваша виртуальность равна /home/blah/scratch
. Процесс Python знает, что он был выполнен из /home/blah/scratch/bin/python
(который обычно является просто копией двоичного файла вашего системного Python /usr/bin/python
), и он знает свою собственную версию X.Y
, потому что он скомпилирован в нее. Затем Python ищет lib/pythonX.Y/os.py
в следующем порядке:
/home/blah/scratch/bin/lib/pythonX.Y/os.py
/home/blah/scratch/lib/pythonX.Y/os.py <-- this file should exist
/home/blah/lib/pythonX.Y/os.py
/home/lib/pythonX.Y/os.py
/lib/pythonX.Y/os.py
Останавливается на /home/blah/scratch/lib/pythonX.Y/os.py
, потому что это первый файл, который действительно существует. Если этого не произойдет, Python будет продолжать искать. Затем он устанавливает sys.prefix
на основе этого. Он использует аналогичный процесс для установки sys.exec_prefix
, а затем на его основе строится sys.path
.