【问题标题】:Python 3.8 - Package release broken, but works when installed locallyPython 3.8 - 软件包版本已损坏,但在本地安装时有效
【发布时间】:2021-11-26 21:04:59
【问题描述】:

好的,我正在开发我们在 Pypi 和 Anaconda 上发布的这个 python 包。在其中,我们有许多包含类的 python 文件。从历史上看,我一直使用以下结构,没有问题。

repo/
    conda/
        conda_build_config.yaml
        meta.yaml
    setup.py
    src/
        A
            ClassA
        B
            ClassB
        ...
        __init__.py
            from .A import ClassA
            from .B import ClassB
            ...

我们进行 GitHub 发布,GitHub 操作为我们捆绑所有内容并发布到 PyPi 和 Condas。很简单。但是类的数量已经增长到一个平面层次结构并没有真正意义的地步,我们希望开始将它们分组到嵌套在各个组中的子包中,如下所示:

repo/
    conda/
        conda_build_config.yaml
        meta.yaml
    setup.py
    package/
        Group1/
            A
                ClassA
            B
                ClassB
            __init__.py
                from .A import ClassA
                from .B import ClassB
        Group2/
            C
                ClassC
            D
                ClassD
            __init__.py
                from .C import ClassC
                from .D import ClassD
        ...
        __init__.py
            from .Group1 import ClassA
            from .Group1 import ClassB
            from .Group2 import ClassA
            from .Group2 import ClassB
            ...

奇怪的是:如果我在本地运行 pip install -e . 来测试它,这个新设置会完全按照我想要的方式工作。但是,如果我将它发布到 PyPi pip install package,然后运行 ​​import package,我会收到以下错误:

ModuleNotFoundError: No module named package.A

我尝试了几种不同的组织结构,以各种方式使用 init.py,以及我从其他相关问题中找到的所有建议和结构,但似乎总是这样,什么推送到 PyPi 时,本地安装不起作用。我在这里错过了什么?

---编辑---

除了接受的答案中描述的解决方案之外,我还必须将我的package/ 移动到src/ 并将以下内容添加到我的setup.py

package_dir={"": "src"},
packages=find_packages(where="src"),

这确保所有子包都捆绑到包中。

【问题讨论】:

    标签: python pip packaging


    【解决方案1】:

    我们可以尝试在您的__init__.py 文件中添加__all__ 变量。
    例如在Group1 中的__init__.py 中,我们可以添加:

    from .A import ClassA
    from .B import ClassB
    
    __all__ = [
        'ClassA',
        'ClassB'
    ]
    

    并将相同的技巧应用于其他文件夹中的其他 __init__.py
    这应该可以完成工作。

    【讨论】:

    • 就是这样,非常感谢!不敢相信我在其他任何地方都找不到。
    • 我同意你的观点,第一次对我来说也很难找到它。很高兴为您提供帮助!
    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 2015-11-22
    • 2012-02-16
    • 2018-04-08
    • 2021-05-13
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多