使用新名称创建 Python 包,保持旧包导入不变

Creating Python package with new name keeping old package import intact

不确定我的标题是否正确,但这里是关于这个问题的简短描述。我在 GitHub 和 PyPI 上有一个包 A,它的用法是:

pip install A
import A 
A.module()

当前目录结构:

我想在 PyPI 上创建一个新包 B 但希望保持向后兼容性,所以下面的工作:

pip install B
import A 
A.module()

import B
B.module()

为了确保现有应用程序不中断,希望确保 import A 正常工作。

实现这一目标的可能解决方案是什么?

分发名称(“pip install”之后的内容)和包导入名称是完全独立的。安装名称与导入名称匹配只是一种常见的约定。

所以在你的安装程序中这样做:

# setup.py

from setuptools import setup

setup(
    name="B",
    version="0.1",
    packages=["A", "B"],
    ...
)

在设置调用中,“name”关键字参数是用户用来安装包的分发名称 - python -m pip install B 在本例中。您上传到 PyPI 的生成的工件将在文件名中包含此 B,例如

B-0.1-py3-none-any.whl
B-0.1.tar.gz

packages 关键字参数是顶级导入名称,可以有多个,这些名称通常与您的项目目录结构相匹配:

.
├── A
│   └── __init__.py
├── B
│   └── __init__.py
└── setup.py

这允许“B”发行版同时提供 A 和 B 导入,并充当“A”发行版的直接替代品。