Это зависит.Если ни один из пакетов, импортирующих 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
пришли позже.)