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.0
的setup.py
除非所有其他人都执行,否则不会执行。在下图中,requests
解包后没有运行setup.py
。
出于某种奇怪的原因,wikipedia
的setup.py
包含import wikipedia
,这反过来会在安装之前导入它的依赖项;但是它通过了 CI 测试,因为它通过 pip 单独安装需求,然后运行 setup.py
。
为了克服这种情况,我制作了一个设置脚本,其中包括:
pip install -r requirements.txt
pip install wikipedia
pip install -e .
这会安装requests-2.3.0
和beautifulsoup4
;
然后安装wikipedia
(然后可以运行setup.py
并安装wikipedia
和requests-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 名称