2014-11-22 2 views
1

Я знаком с тем, как работает python virtualenv, и когда мы активизируем, он в основном изменяет переменную и PATH. Прежде всего, он добавляет каталог bin virtualenv в систему PATH и устанавливает VIRTUAL_ENV, чтобы указать на каталог виртуального env root.Как пип знает о virtualenv и где устанавливать пакеты

В качестве эксперимента я сделал это с помощью virtualenv (версия 1.11.6):

# Created two fresh virtual environments 
virtualenv /tmp/env1 
virtualenv /tmp/env2 
echo $PATH 
> SOME_PATH_VALUE 

# Play with env1 
source /tmp/env1/bin/activate 
echo $PATH 
> /tmp/env1/bin:SOME_PATH_VALUE 
pip list 
> pip, setuptools, wsgiref 
pip install wget 
> pip, setuptools, `wget`, wsgiref 

# Obviously env2 has pip, setuptools and wsgiref only as of now 
export PATH=/tmp/env2/bin:$PATH 
pip list 
> pip, setuptools, wsgiref 

С моих экспериментов было исключительно в зависимости от PATH переменной для определения пути установки, но я не уверен, если то будет полная картина. Таким образом, ключевыми вопросами являются:

  1. Как пип знает, где установить запрошенный пакет?
  2. Если мой virtualenv настроен не искать пакеты сайтов (гарантируется, что файл no-global-site-packages.txt существует в правильном месте) и переменная PATH правильно установлена, но установка pip все еще выглядит в системных сайтах-пакетах, а затем как отлаживать это?

ответ

1

Виртуальные команды имеют команду pip, установленную в своих каталогах bin/. При замене PATH вы выполняете команду pip каждый раз.

Скрипт bin/pip привязан к исполняемому файлу bin/python для этого виртуального env и, в свою очередь, исполняемый файл bin/python привязан к virtualenv; вы не имеете, чтобы использовать source bin/activate, чтобы иметь возможность использовать virtualenv, потому что только исполняемый файл bin/python имеет всю необходимую ему информацию.

Вы можете увидеть это, посмотрев на sys.prefix variable:

$ virtualenv-2.7 /tmp/env1 
New python executable in /tmp/env1/bin/python2.7 
Also creating executable in /tmp/env1/bin/python 
Installing setuptools, pip...done. 
$ virtualenv-2.7 /tmp/env2 
New python executable in /tmp/env2/bin/python2.7 
Also creating executable in /tmp/env2/bin/python 
Installing setuptools, pip...done. 
$ env1/bin/python -c 'import sys; print sys.prefix' 
/private/tmp/env1 
$ env2/bin/python -c 'import sys; print sys.prefix' 
/private/tmp/env2 
+0

Отлично! Таким образом, каждая установка virtualenv имеет другой двоичный файл bin/python, который имеет информацию, жестко закодированную при создании среды. –

Смежные вопросы