python - Python/pip 如何处理冲突的传递依赖项?

标签 python pip dependency-management python-poetry

假设我想安装包 a这需要软件包 b1b2 .反过来,b1需要 c > 1.0.0b2需要 c < 1.0.0 .所以要求b1b2不能与同一个包裹同时履行。

原则上/其他编程语言,这不是问题。一个可以安装两个版本的c并排并确保 b1使用除 b2 以外的其他版本.

但是,我不确定 pip 是否可以安装同一个包的两个版本。我的第一个问题是:pip 可以安装一个包的两个版本吗?

我的主要问题是如何实际处理该问题。我现在能想到的唯一方法就是

  • 前叉 b1 (或 b2)和 c 的版本适用于 fork ,并上传 b1_forkedc_for_b1_forked到 PyPI,或
  • 包括 b1 的代码(或 b2)直接在我的项目中

  • 两者似乎都比必要的问题更多。

    我试过的
    >>> import natsort; print(natsort.__file___)
    '/home/moose/.local/lib/python3.6/site-packages/natsort/__init__.py'
    
    $ cd /home/moose/.local/lib/python3.6/site-packages
    $ ls
    [... a lot of *.dist-info directories, some .py files, some .so files, ]
    [... some directories called like the packages I've installed]
    

    所以我很确定这是 Python 查找已安装包的地方,并且只安装了一个版本(尽管 *-dist-info 目录让我有 pip 困惑)。

    This blog post表明目前没有很好的解决冲突的传递依赖关系的方法。其他项目(例如诗歌)对此有帮助吗?

    最佳答案

    In principle / other programming languages, this is not a problem. One could install two versions of c side by side and make sure that b1 uses another version than b2.



    那不是解决办法。如 c迟早会管理共享资源(例如控制台)b1b2将通过不同的 c 踩踏对方的输入或输出s,你最终会得到不正确的输入和垃圾输出。

    你所描述的是一个普遍的问题,不限于Python或pip .唯一的办法就是改b1和/或 b2同意 c 的版本.要么降级b1允许 c < 1.0或升级 b2允许 c > 1.0 .

    Can pip install two versions of one package?



    不,问题不在 pip但在 Python 中:它的导入系统不允许从同一包的不同版本导入。你可以看看 mitsuhiko/multiversion (仅限 Python2)。

    关于python - Python/pip 如何处理冲突的传递依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60084441/

    相关文章:

    python - 制作对象的非阻塞版本的 Pythonic 方法是什么?

    python - pip install 无法从 Azure Ubuntu 找到版本

    java - Spring Boot、AWS 应用程序上的 Jackson 数据绑定(bind)依赖项错误

    node.js - "npm update"正在安装模块的 beta 版本,而不是在 "npm install"之后安装的稳定版本

    python - 在 Python 中将用户输入与 mysql 数据库值进行比较

    python - 一种在 settings.py 中设置 Django SITEURL 常量的方法

    python - 如何为 Python 2 安装 pip

    python pip install psycopg2 安装错误

    java - 从导入的依赖项覆盖 Gradle 项目配置

    python - 在生产系统中重置 Django 迁移