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

Python 如果站点包的更新超出了我在带有pip的virtualenv中指定的版本,会发生什么情况?,python,virtualenv,pip,Python,Virtualenv,Pip,假设我的virtualenv安装没有使用——没有站点包。我运行了bin/pip install somepackage==1.0.0,但它已经存在于我的站点包中,因此没有安装它。稍后,已安装的站点包的副本将更新为somepackage==2.0.0 我的虚拟电视会发生什么?它将使用版本2,还是自己下载版本1?仅使用在sys.path中找到的具有给定名称的第一个包/模块。如果您的venv早于系统目录,则将使用您的venv。视情况而定。如果导入somepackage的包中没有一个使用setuptoo

假设我的virtualenv安装没有使用
——没有站点包。我运行了
bin/pip install somepackage==1.0.0
,但它已经存在于我的
站点包中,因此没有安装它。稍后,已安装的
站点包的副本将更新为
somepackage==2.0.0


我的虚拟电视会发生什么?它将使用版本2,还是自己下载版本1?

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

视情况而定。如果导入
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
,则一切正常。如果随后使用
pip
将系统站点包更新为
somepackage 2.0.0
,从而卸载旧版本,脚本将在运行时失败,原因是:

pkg_resources.DistributionNotFound: somepackage==1.0.0
如果您使用
easy\u install
而不是
pip
安装了两个版本的
somepackage
,情况通常会有所不同。默认情况下,
easy_install
不卸载软件包,它支持多版本软件包(多版本)。因此,
somepackage
的两个版本都可以在系统站点包中使用,并且脚本不会失败


setuptools
(以及它的
发行版
克隆版)必须跨越许多障碍,才能使多版本支持合理工作。许多开发人员不赞成所有这些额外的复杂性,并认为使用单独的
virutalenv
支持多个版本的包更容易、更透明,因此,更简单的
pip
模型更合适。(公平地说,
setuptools
virtualenv
后来出现了。)

我相信在我的场景中,不会在virtualenv中安装任何东西,因为在
站点包中已经找到了合适的安装程序。如果没有安装任何东西,那么首先在venv中没有任何东西覆盖系统目录就成了一件小事。因此virtualenv的Python将使用更新的站点软件包中的版本,并且pip不会做任何事情来确保仍然使用原始指定版本,因此有必要使用
--无站点软件包
,以确保特定版本,对吗?或者您需要强制安装到venv中,而不管系统目录中是否存在软件包。