setup.py & pip:从 requirements.txt 覆盖依赖项的子依赖项之一

Posted

技术标签:

【中文标题】setup.py & pip:从 requirements.txt 覆盖依赖项的子依赖项之一【英文标题】:setup.py & pip: override one of the dependency's sub-dependency from requirements.txt 【发布时间】:2014-07-21 02:39:12 【问题描述】:

我目前正在处理一个包,在我的requirements.txt 中,我有一个依赖项:wikipedia。现在,wikipedia 1.3 使用 requests-2.2.1 而我的包使用版本 2.3.0。

另外,正如人们所料,wikipedia-1.3 的安装取决于它的依赖关系。

但是,如果我启动一个新的 virtualenv 并直接在我的requirements.txt 中包含wikipedia,它会在requests 上给出一个ImportError,因为当时setup.py 运行,requests-2.3.0setup.py除非所有其他人都执行,否则不会执行。在下图中,requests 解包后没有运行setup.py

出于某种奇怪的原因,wikipediasetup.py 包含import wikipedia,这反过来会在安装之前导入它的依赖项;但是它通过了 CI 测试,因为它通过 pip 单独安装需求,然后运行 ​​setup.py

为了克服这种情况,我制作了一个设置脚本,其中包括:

pip install -r requirements.txt
pip install wikipedia
pip install -e .
这会安装requests-2.3.0beautifulsoup4; 然后安装wikipedia(然后可以运行setup.py并安装wikipediarequests-2.2.1) 然后'pip install -e.'选项再次安装我的包和requests-2.3.0

因此,requests-2.3.0 首先被安装,然后被旧版本 2.2.1 替换,然后再次被 2.3.0 替换。

我尝试通过各种规范来解决这个问题,但这些规范令人困惑。我该如何克服这种混乱?

【问题讨论】:

解决这个问题的正确方法是告诉wikipedia项目不要依赖特定的版本,而是指定一个最小版本。 是的,我已经这样做了github.com/goldsmith/Wikipedia/issues/50,但仍然希望是否有办法覆盖? 另外,为什么'requests'模块在解压后不显示'running setup.py'? 我大量更新了您帖子的格式。尽量避免不必要的强调,并在适用的情况下使用代码标签`。也不要使用图像来显示代码输出。这使得搜索引擎(以及未来的读者)更难(如果不是不可能的话)找到这篇文章。相反,将控制台输出复制到您的帖子中。 感谢布拉姆。感谢您的努力。 【参考方案1】:

正如 Martijn 所指出的,正确的方法是在项目中指定最低版本,前提是在子依赖项的未来版本中保留完全兼容性。

如果您无法更改需求文件,您可以下载项目并在本地编辑需求文件以指定您想要的任何版本。这可以通过pip download 命令完成:

pip download wikipedia==1.3

此外,如果您想在整个过程中使用pip 并保留requests==2.3.0 而无需删除并重新安装,您可以指定constraints 文件。这可以通过以下方式完成:

pip install -c constraints.txt wikipedia==1.3

constraints.txt 包含以下内容:

requests>=2.3.0
beautifulsoup4

这将产生一个警告,但wikipedia 包将被安装:

wikipedia 1.3.0 has requirement requests==2.2.1, but you'll have requests 2.3.0 which is incompatible.
Installing collected packages: wikipedia
Successfully installed wikipedia-1.3.0

现在,如果您真的知道自己在做什么(或者只是想尝试是否可行),您可以使用 --no-deps 标志,它将完全忽略包依赖关系并且不会产生上述警告:

pip install --no-deps -c constraints.txt wikipedia==1.3

在这两种情况下pip freeze 显示:

beautifulsoup4==4.6.0
bs4==0.0.1
requests==2.3.0
wikipedia==1.3.0

注意:这是使用 pip 10.0.1 测试的,但它应该适用于任何最新的 pip 版本。

【讨论】:

以上是关于setup.py & pip:从 requirements.txt 覆盖依赖项的子依赖项之一的主要内容,如果未能解决你的问题,请参考以下文章

“python setup.py install”和“pip install”之间的区别

setup.py 中的 Python 包名称与 pip 名称

pip 下载而不执行 setup.py

pip 安装失败并出现 FileNotFoundError: setup.py

用于通过 pip 卸载的 Setup.py

setup.py 不尊重 PIP_INDEX_URL