假设我有一个不使用--no-site-packages
的virtualenv安装。我运行了bin/pip install somepackage==1.0.0
,但我的site-packages
中已经存在,所以它没有安装。之后,安装的副本site-packages
将更新为somepackage==2.0.0
。
我的virtualenv会发生什么?它会使用版本2,还是自己下载版本1?
答案 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
模型更为合适。 (公平地对待setuptools
,virtualenv
稍后出现。)