Подтвердить что ты не робот

Как работает virtualenv?

Я проверил активацию script, и мне кажется, что все, что она делает, это:

  • set VIRTUAL_ENV env
  • добавить $VIRTUAL_ENV/bin перед PATH

Как virtualenv предоставляет эту магическую виртуальную среду? Что мне не хватает?

4b9b3361

Ответ 1

Я опишу основной процесс, который я узнал из презентации, с которой связан jcollado.

Когда начинается Python, он смотрит на путь двоичного кода и его префиксы. Итак, скажем, ваш virtualenv /home/blah/scratch. Тогда двоичный код python (который является всего лишь копией двоичного кода вашей системы python) будет находиться в /home/blah/scratch/bin/python. Python ищет lib/pythonX.X/os.py в /home/blah/scratch/bin/, затем /home/blah/scratch/, и он останавливается там, потому что /home/blah/scratch/lib/pythonX.X/os.py существует. Если бы это не так, Python продолжал искать /home/blah/lib/pythonX.X/os.py и т.д. Затем он устанавливает sys.prefix на основе этого. Он использует аналогичный процесс для установки sys.exec_prefix, а затем на нем строится sys.path.

Ответ 2

Это очень хорошая презентация по этому вопросу. В основном, это объясняет шаги, чтобы написать собственный virtualenv с теми же трюками, которые использовал Ian Bicking для его записи.

Ответ 3

  • Сначала пользователь создает новый virtualenv с помощью команды virtualenv myenv. Это создает каталог с именем myenv и копирует бинарную систему python в myenv/bin. Он также добавляет другие файлы и директории в myenv, включая установку script в bin/activate и подкаталог lib для модулей и пакетов.
  • Затем пользователь активирует script с . 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 также содержит script с именем pip, поэтому, когда пользователь устанавливает новые пакеты с помощью pip из virtualenv, они будут установлены в myenv/lib/pythonX.Y