【问题标题】:setup.py & pip: override one of the dependency's sub-dependency from requirements.txtsetup.py & pip:从 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'?
  • 我大量更新了您帖子的格式。尽量避免不必要的强调,并在适用的情况下使用代码标签`。也不要使用图像来显示代码输出。这使得搜索引擎(以及未来的读者)更难(如果不是不可能的话)找到这篇文章。相反,将控制台输出复制到您的帖子中。
  • 感谢布拉姆。感谢您的努力。

标签: python python-2.7 pip setup.py requirements.txt


【解决方案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 版本。

【讨论】:

    猜你喜欢
    • 2014-03-18
    • 2022-01-23
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2021-08-05
    • 2020-04-12
    • 2021-03-02
    相关资源
    最近更新 更多