Как работает 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 с теми же хитростями, которые использовал Ян Биккинг.

  1. Сначала пользователь создает новый virtualenv с помощью команды virtualenv myenv, Это создает каталог с именем myenv и копирует двоичный файл системного Python в myenv / bin. Он также добавляет другие необходимые файлы и каталоги в myenv, включая скрипт установки в bin / activ и подкаталог lib для модулей и пакетов.
  2. Затем пользователь отправляет сценарий активации с помощью . myenv/bin/activate, который устанавливает оболочку PATH переменная окружения, чтобы начать с myenv / bin.
  3. Теперь, когда пользователь запускает python из этой оболочки он выполнит копию двоичного файла, хранящегося в myenv / bin. Несмотря на то, что двоичный файл идентичен файлу в / usr / bin / python, стандартный двоичный файл python предназначен для поиска пакетов и модулей в каталогах, относящихся к пути двоичного файла (эта функциональность не связана с virtualenv). Он выглядит в ../lib/pythonX.Y, где X и Y - номера старших и младших версий двоичного файла python. Так что теперь это выглядит в myenv / lib / pythonX.Y.
  4. Каталог myenv / bin также содержит скрипт с именем pip так что когда пользователь устанавливает новые пакеты, используя pip из virtualenv, они будут установлены в myenv / lib / pythonX.Y
Другие вопросы по тегам