Что произойдет, если пакет сайта будет обновлен за пределы версии, указанной в virtualenv с помощью pip? - PullRequest
1 голос
/ 17 апреля 2011

Предположим, у меня есть установка virtualenv, которая не использует --no-site-packages. Я запускаю bin/pip install somepackage==1.0.0, но он уже присутствует в моем site-packages, поэтому он не установлен. Позже установленная копия site-packages обновляется до somepackage==2.0.0.

Что будет в моей виртуальности? Будет ли он использовать версию 2 или загрузить версию 1 для себя?

Ответы [ 2 ]

1 голос
/ 17 апреля 2011

Это зависит.Если ни один из пакетов, импортирующих somepackage, не использует API setuptools, он работает, как описано выше.Если какие-либо пакеты в вашем virtualenv используют setuptools (или Distribute), чтобы указать конкретные требования к версии для somepackage, setuptools будет искать версию somepackage, которая соответствует требованиям.Если он не может найти подходящую установленную версию во время установки, он выполнит внешний поиск и попытается установить его.Если он не может найти его во время выполнения, происходит сбой программы за исключением.

from setuptools import setup
setup(
    name = "HelloWorld",
    version = "0.1",
    scripts = ['say_hello.py'],
    install_requires = ['somepackage == 1.0.0'],
)

Например, если somepackage 1.0.0 уже был установлен в системных пакетах сайта, все в порядке.Если затем вы обновите системные пакеты сайта до somepackage 2.0.0 с помощью pip, который удалит старую версию, сценарий завершится с ошибкой во время выполнения с:

pkg_resources.DistributionNotFound: somepackage==1.0.0

Если вы установили обе версии somepackageс easy_install вместо pip все было бы иначе.По умолчанию easy_install не удаляет пакеты и поддерживает несколько версий пакетов (несколько версий яиц).Таким образом, обе версии somepackage будут доступны в системных пакетах сайта, и скрипт не завершится с ошибкой.

setuptools (и его клон Distribute) должен перепрыгнуть через множество обручей, чтобы сделатьподдержка нескольких версий работает разумно.Многие разработчики недовольны всей этой дополнительной сложностью и утверждают, что проще и прозрачнее поддерживать несколько версий пакетов с отдельными virutalenv, и для этого более подходящей является более простая модель pip.(Справедливости ради setuptools, virtualenv пришли позже.)

1 голос
/ 17 апреля 2011

Будет использоваться только первый пакет / модуль, найденный в sys.path с указанным именем.Если ваш venv более ранний, чем системный каталог, то ваш venv будет использоваться.

...