如何从 python3 中的子文件夹导入模块(__init__.py 为空)

How to import a module from a subfolder in python3 (with empty __init__.py)

我想从子文件夹中的文件调用函数。我宁愿静态地做。我使用空的 __init__.py 文件,因为我读到在简单的情况下它们可以是空的(我的不能更简单)或者从 3.5 开始我根本不需要它们。但我愿意填满它们。

我有以下文件结构:

test
├── callfoo.py   (main)
├── __init__.py  (empty)
└── folder
    ├── submodule.py
    └── __init__.py (empty)

callfoo.py:

#import statement wanted

def main():
    foo()

if __name__ == "__main__":
        main()

submodule.py

def foo():
    print('foo')

对于我试过的导入语句:

import test.folder.submodule
from test.folder import submodule
from test.folder.submodule import foo

每个结果 ModuleNotFoundError: No module named 'test.folder' 我在这里有点困惑,因为它们直接取自 Documentation

import .folder.submodule -> invalid syntax importlib.import_module('test.folder.submodule') ModuleNotFoundError:没有名为 'test.folder'

的模块

这个有效:

import importlib.util
spec = importlib.util.spec_from_file_location("submodule", "/home/.../test/folder/submodule.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)

但我真的不想动态地执行它,尤其是对于多个文件。

这个 处理我的错误消息,但据我所知不处理子文件夹(它对我来说工作正常 submodule.pycallfoo.py 处于同一级别)

有几个问题涉及从子文件夹导入,但我无法让它们为我工作。 我希望提供了一个非常简单的问题公式。

假设我们有这个 folders/files 架构:

test
├── callfoo.py
└── folder
    ├── __init__.py
    └── submodule.py

1 directory, 3 files

callfoo.py:

from folder.submodule import foo

def main():
    foo()

if __name__ == '__main__':
    main()

submodule.py:

def foo():
    print('foo in submodule')

现在将自己放在callfoo.py和运行的同级文件夹中:

$ python3 callfoo.py

输出:

> foo in submodule