如果站点包的更新超出我在带有pip的virtualenv中指定的版本,会发生什么?

时间:2011-04-17 04:06:33

标签: python virtualenv pip

假设我有一个使用--no-site-packages的virtualenv安装。我运行了bin/pip install somepackage==1.0.0,但我的site-packages中已经存在,所以它没有安装。之后,安装的副本site-packages将更新为somepackage==2.0.0

我的virtualenv会发生什么?它会使用版本2,还是自己下载版本1?

2 个答案:

答案 0 :(得分:1)

将仅使用sys.path中具有给定名称的第一个包/模块。如果您的venv早于系统目录,那么您的venv将被使用。

答案 1 :(得分:1)

这取决于。如果导入somepackage的任何软件包都没有使用setuptools API,那么它的工作原理如上所述。如果您的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模型更为合适。 (公平地对待setuptoolsvirtualenv稍后出现。)