Python依赖项:将两个包合并为一个

Python依赖项:将两个包合并为一个,python,pip,setuptools,Python,Pip,Setuptools,我有两个python包A和B,我想合并成A,也就是说B的所有功能现在都可以在A.B中访问。以前,A-1.0依赖于B-1.0。现在我想避免A-2.0的用户仍然安装了B-1.0,我不知道如何正确处理这个问题 我提出了不同的解决方案/想法: 在A-2.0中包含一些试图导入B的代码,如果引发导入错误,捕获异常并继续,否则抛出并行安装的运行时错误B 以某种方式将B标记为a-2.0的拦截器(这可能吗?) 为B创建一个“假”后续版本,以便更新虚拟环境或安装B的“最新”版本的人在导入时得到一个空包,该包会引发

我有两个python包
A
B
,我想合并成
A
,也就是说
B
的所有功能现在都可以在
A.B
中访问。以前,
A-1.0
依赖于
B-1.0
。现在我想避免
A-2.0
的用户仍然安装了
B-1.0
,我不知道如何正确处理这个问题

我提出了不同的解决方案/想法:

  • A-2.0
    中包含一些试图导入
    B
    的代码,如果引发导入错误,捕获异常并继续,否则抛出并行安装的运行时错误
    B

  • 以某种方式将
    B
    标记为
    a-2.0
    的拦截器(这可能吗?)

  • B
    创建一个“假”后续版本,以便更新虚拟环境或安装
    B
    的“最新”版本的人在导入时得到一个空包,该包会引发异常

我欢迎你的意见和经验

我想,你不能!(至少在不使用这些技巧的情况下,如您所述)

据我所知,Python包系统没有“允许”包的概念。可能有一个人发明了一个不同的包C,他称之为B,但功能完全不同。这样的概念将禁止包a的用户使用包C(别名B)

因此,我会与A的用户沟通,B不再需要,并确保您的新编码根本不引用B。当有人安装B时,它就像一个与您的无关的第三方库

当然,当A和B的功能非常混杂,并且其他用户代码也必须直接处理B,并且对A有(允许的)副作用时,当仍然安装旧B时,您可能会遇到麻烦。但是你最初的设计也不是最好的

在这种情况下(当您确实需要合并包时,请参见下文),我建议您使用一个全新的包名,如“newA”,以强调某个事实,即某些东西已经发生了根本性的变化(因此,旧的a和B之间的混合也更有可能被检测到)


但当然,我会支持msw的观点,即你自己制造问题。通常情况下,使用较小的包(当然,如果它们的大小合理的话)也比使用较大的“我管理世界”包要好。您只需将较小的软件包更好地组合到不同的应用程序中即可。

“我希望将A和B合并到A”-您绕过了软件包管理器,从而为自己制造了一个问题,该管理器可以正确处理依赖项。你应该有一个令人信服的理由来合并它们,或者根本不合并它们。如果你列出一个表格(a.version,B.version,is_allowed?),这个问题会更清楚