Как работает virtualenv?
Я проверил скрипт активации, и мне кажется, что все, что он делает, это:
- установить VIRTUAL_ENV env
- добавить $VIRTUAL_ENV/bin перед PATH
Как virtualenv
обеспечить этим волшебную виртуальную среду? Что мне не хватает?
3 ответа
Я опишу основной процесс, который я узнал из презентации @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
построен на основе этих.
Это очень хорошая презентация на эту тему. В основном, это объясняет шаги, чтобы написать свой собственный virtualenv
с теми же хитростями, которые использовал Ян Биккинг.
- Сначала пользователь создает новый virtualenv с помощью команды
virtualenv myenv
, Это создает каталог с именем myenv и копирует двоичный файл системного Python в myenv / bin. Он также добавляет другие необходимые файлы и каталоги в myenv, включая скрипт установки в bin / activ и подкаталог lib для модулей и пакетов. - Затем пользователь отправляет сценарий активации с помощью
. myenv/bin/activate
, который устанавливает оболочкуPATH
переменная окружения, чтобы начать с myenv / bin. - Теперь, когда пользователь запускает
python
из этой оболочки он выполнит копию двоичного файла, хранящегося в myenv / bin. Несмотря на то, что двоичный файл идентичен файлу в / usr / bin / python, стандартный двоичный файл python предназначен для поиска пакетов и модулей в каталогах, относящихся к пути двоичного файла (эта функциональность не связана с virtualenv). Он выглядит в ../lib/pythonX.Y, где X и Y - номера старших и младших версий двоичного файла python. Так что теперь это выглядит в myenv / lib / pythonX.Y. - Каталог myenv / bin также содержит скрипт с именем
pip
так что когда пользователь устанавливает новые пакеты, используя pip из virtualenv, они будут установлены в myenv / lib / pythonX.Y