将子文件夹 python 文件导入为文件夹(包),而不是模块

Import subfoldered python files as a folder (package), not as a module

是否可以在 from ... import gui 之后调用函数 gui.settings.load()?我正在尝试设置这样的文件夹。

main.py
gui/
    __init__.py
    settings.py

并且在settings.py

def load():
    print('Hello') 

在main.py

import gui

gui.settings.load()

我必须和 __init__.py 打交道吗?

现在,我必须将文件命名为 guiSettings.py,我想让它更简单。

根据您的定义加载不是一个函数,它是一个 class,所以您不能这样调用(class 意味着要实例化,您应该查看 OOP 概念)。如果你想调用函数 "load" 你应该将它定义为:

def load(parameters):
  #function body
  #optional return statement

并将目录作为模块进行交互 e.i。使用点符号。该目录应包含一个 __init__.py 文件。根据文档:

Packages are a way of structuring Python’s module namespace by using “dotted module names”. For example, the module name A.B designates a submodule named B in a package named A.

另外:

The __init__.py files are required to make Python treat the directories as containing packages;

所以在你的情况下你应该在外部 gui 目录和内部 gui 目录中定义 "__init__.py" (可能是空的)。然后在设置模块中,您可以像上面那样定义加载函数。你可以在这里阅读更多关于包和模块的信息 https://www.tutorialspoint.com/python/python_modules.htm

如果我真的想调用 gui.settings.load(),我可能会像这样构建我的目录。

main.py
src/
    __init__.py
    gui/
        __init__.py
        settings.py

main.py

from src import *

gui.settings.load()

src/__init__.py

from . import gui

src/gui/__init__.py

from . import settings

src/gui/settings.py还是和上面一样

似乎将 __all__ = ['gui']__all__ = ['settings'] 分别放在 __init__.py 中是行不通的,除非我误解了 __all__ 的工作原理。

此外,在这种情况下 __init__.py 不能为空。

此外,在 main.py.

中不带 from 只放 import * 是行不通的