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