正确构建 Python 包?

Properly structuring Python packages?

我有一个 Python3.7 包,结构如下。

project             # Repository
--\README
--\LICENSE
--\setup.py
--\project          # Source
----\project.py
----\__init__.py    # Init1
----\functions
-------\__init__.py # Init2
-------\moduleA.py
-------\ ...
-------\moduleZ.py

里面 project.py 我有以下内容。

from functions.moduleA import functionA
from functions.moduleB import functionB
...
functionA = functionA
functionB = functionB

Init2完全空白。但是 Init1 有以下内容。

from .project import functionA
from .project import functionB

但是当我在 Repository 目录中执行 $ python -c 'import project' 时,我得到一个 ModuleNotFoundError: No module named 'functions'。这里可能有一些非常简单的问题出了问题。不过,导入在 Source 目录中可以正常工作。最后,我对用户通过 setup.py 安装所有东西并像这样使用我的项目感兴趣。

import project

project.functionA(...)
...
project.functionB(...)

您的 project.py 文件无法正常工作。这些行导致错误:

from functions.moduleA import functionA
from functions.moduleB import functionB

这些导入不起作用,因为 functions 不是顶级模块,而是属于 project 包的子包。您可以通过在每个模块名称(.functions.moduleA 等)的开头添加 . 来修复它们。我想你也可以命名绝对模块名称,如果你出于某种原因喜欢它(例如 project.functions.moduleA)。

赋值语句也不做任何事情。 functionA = functionA可以删除,完全没有区别

我不太清楚 project.py 文件的用途是什么。 project/__init__.py 文件旁边似乎完全多余,它似乎应该包含完全相同的值。也许您应该将它们合并到一个文件中(可能是 __init__.py 文件)。

我也仔细想想你是不是真的需要那么多分包和模块。虽然有时只是风格问题,但将密切相关的内容保留在同一个模块中会非常方便。您当然不需要为您编写的每个函数都使用一个单独的模块!