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

pee*_*eer 8 python-import python-3.x

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

我有以下文件结构:

test
??? callfoo.py   (main)
??? __init__.py  (empty)
??? folder
    ??? submodule.py
    ??? __init__.py (empty)
Run Code Online (Sandbox Code Playgroud)

callfoo.py:

#import statement wanted

def main():
    foo()

if __name__ == "__main__":
        main()
Run Code Online (Sandbox Code Playgroud)

submodule.py

def foo():
    print('foo')
Run Code Online (Sandbox Code Playgroud)

对于我尝试过的import语句:

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

每一个导致ModuleNotFoundError: No module named 'test.folder' 我在这里有点困惑,因为它们是直接从文档中获取的

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)
Run Code Online (Sandbox Code Playgroud)

但我真的不想动态地这样做,特别是对于几个文件.

这个ModuleNotFoundError:没有名为x的模块处理我的错误消息,但是根据我的判断,它没有处理子文件夹(对于我来说,submodule.py它在同一级别上工作正常callfoo.py)

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

Chi*_*xus 7

假设我们有这个文件夹/文件架构:

test
??? callfoo.py
??? folder
    ??? __init__.py
    ??? submodule.py

1 directory, 3 files
Run Code Online (Sandbox Code Playgroud)

callfoo.py:

from folder.submodule import foo

def main():
    foo()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

submodule.py:

def foo():
    print('foo in submodule')
Run Code Online (Sandbox Code Playgroud)

现在把你的自己放在同一级别的文件夹中callfoo.py并运行:

$ python3 callfoo.py
Run Code Online (Sandbox Code Playgroud)

输出:

> foo in submodule
Run Code Online (Sandbox Code Playgroud)