如何从python3中的子文件夹导入模块(带空__init __。py)

时间:2018-01-06 17:05:24

标签: python-3.x python-import

我想从子文件夹中的文件调用函数。我宁愿做静态的。我使用空的__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)

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

ModuleNotFoundError: No module named x处理我的错误消息,但不是我所知道的子文件夹(对于submodule.pycallfoo.py处于同一级别的#[macro_use] extern crate arrayref; /// Get the first 3 elements of `bytes` as a reference to an array /// **Panics** if `bytes` is too short. fn first3(bytes: &[u8]) -> &[u8; 3] { array_ref![bytes, 0, 3] } ,它可以正常工作)

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

1 个答案:

答案 0 :(得分:5)

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

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