【发布时间】: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"),
这确保所有子包都捆绑到包中。
【问题讨论】: