Как работает virtualenv? - PullRequest
       1

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

51 голосов
/ 08 декабря 2011

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

  • set VIRTUAL_ENV env
  • append $ VIRTUAL_ENV / bin передPATH

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

Ответы [ 3 ]

50 голосов
/ 14 сентября 2012

Я опишу основной процесс, который я узнал из презентации @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.

24 голосов
/ 08 декабря 2011

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

13 голосов
/ 30 января 2014
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...