首页 > 解决方案 > Pip extras 依赖替换

问题描述

我正在创建一个只有 1 个 pypi 依赖项的模块。这个依赖在 pypi 上有 2 个包。一个使用系统库,另一个打包该库的二进制分发。他们看起来像:

theirmodule
theirmodule-binary

我的模块依赖,theirmodule但我希望我的模块的用户能够决定他们是想要依赖的 lib 版本还是二进制版本。我在有关 Extras 的文档中看到。我可以:

setup(
    name="MyModule",
    ...
    extras_require={
        "BIN":  ["theirmodule-binary>=1.2"]
    }
)

但是,如果用户确实pip install mymodule[BIN]pip 将同时安装theirmoduletheirmodule-binary. 这将是一个冲突,因为两者都具有相同的基础导入字符串,例如:

import theirmodule

用于两者。如果不提供 2 个单独的 pypi 包,如何处理?

标签: pipsetuptoolspython-packaging

解决方案


可能类似于以下内容:

setup.py

import setuptools
setuptools.setup(
    name='My-Project',
    # ...
    extras_require={
        'Extra_Dependency_As_Binary': ['Dependency-Project-Binary>=1.2'],
        'Extra_Dependency_As_Library': ['Dependency-Project-Library<=3.4'],
    },
)

然后通过明确指定其中一个来指示 My-Project 的用户可能README文件中)进行安装。例如,使用pip它可以是以下之一:

  • path/to/pythonX.Y -m pip install 'My-Project[Extra_Dependency_As_Binary]'
  • path/to/pythonX.Y -m pip install 'My-Project[Extra_Dependency_As_Library]'

推荐阅读