【问题标题】:Creating Python package with new name keeping old package import intact使用新名称创建 Python 包,保持旧包导入不变
【发布时间】:2021-11-02 13:09:15
【问题描述】:

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

pip install A
import A 
A.module()

当前目录结构:

  • A
    • __init__.py

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

pip install B
import A 
A.module()

import B
B.module()

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

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

【问题讨论】:

  • 这是有问题的,如果有人 pip 安装了 A 和 B,应该是什么行为? import A 应该从 A 导入还是从 B 导入?
  • 好的,我可以避免必须支持 import B..主要目标是确保 import A 仍然有效。
  • 重读你的评论忘记补充我不打算继续支持 pip install A。

标签: python import pypi


【解决方案1】:

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

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

# setup.py

from setuptools import setup

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

在 setup 调用中,“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”发行版的直接替代品。

【讨论】:

  • 谢谢@wim,我会试试这个并更新它的进展情况。
猜你喜欢
  • 1970-01-01
  • 2021-03-31
  • 2021-12-18
  • 1970-01-01
  • 2022-10-15
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多