在python中自动导入文件

在python中自动导入文件,python,blender,Python,Blender,我正在开发一个搅拌机插件,它有几个子模块 - A/__init__.py | |- B/__init__.py 在A/init.py中,我可以执行导入A.B来导入子模块B的内容,但我希望能够自动导入此文件。有没有办法做到这一点 我的想法是使用我的插件实现几个glTF扩展。每个扩展都在自己的子模块中,glTF导出器希望我返回一些类,每个扩展一个类 我不希望手动导入每个扩展并将该类添加到扩展列表中,而是希望这种情况自动发生 而不是 from A.B import B_extension

我正在开发一个搅拌机插件,它有几个子模块

- A/__init__.py
  |
  |- B/__init__.py
在A/init.py中,我可以执行
导入A.B
来导入子模块B的内容,但我希望能够自动导入此文件。有没有办法做到这一点

我的想法是使用我的插件实现几个glTF扩展。每个扩展都在自己的子模块中,glTF导出器希望我返回一些类,每个扩展一个类

我不希望手动导入每个扩展并将该类添加到扩展列表中,而是希望这种情况自动发生

而不是

from A.B import B_extension

glTF2ExportUserExtensions = [A.B.B_extension]
我想要像这样的东西

# A.submodules returns all the submodules and extension() returns the extension class. Im assuming each submodule have an extension() function
glTF2ExportUserExtensions = [A.submodules.extension()]

我需要返回一个类列表

好的,我想我明白你想做什么了

因此,若要在相同的“子模块名称”下导入多个子模块,请将它们导入到与
a/\uu init\uuuu.py
相同级别的单独文件
submodules.py

from .B import B_extension as extension
from .C import C_extension as someothername
import pkgutil

__all__ = []
for loader, module_name, is_pkg in  pkgutil.walk_packages(__path__):
    __all__.append(module_name)
    _module = loader.find_module(module_name).load_module(module_name)
    globals()[module_name] = _module
并在
A/\uuuuu init\uuuuuu.py
中添加:

from . import submodules
现在,如果使用导入
A

import A
您可以使用
A.submodules.extension
A.submodules.someothername
等访问子模块

如果要直接从子模块(如
A.submodules.extension()
)访问子模块函数/类/等,则您的
submodules.py
文件必须如下所示:

from .B.B_extension import extension, anotherBmethod, SomeBClass
from .C.C_extension import Cextension, anotherCmethod, SomeCClass
如果您想实现完全自动导入,请使用
pkgutil
(请参阅),尽管我强烈反对自动导入所有子模块。显式比隐式好。您永远不知道当您更改子模块中的一行时会发生什么,如果不隐式地测试所有导入。。。将此项添加到
A/\uuuuu init\uuuuuuuu.py

from .B import B_extension as extension
from .C import C_extension as someothername
import pkgutil

__all__ = []
for loader, module_name, is_pkg in  pkgutil.walk_packages(__path__):
    __all__.append(module_name)
    _module = loader.find_module(module_name).load_module(module_name)
    globals()[module_name] = _module

你可以从一个重要的文件中导入东西

/import\u file.py的示例

import example
import ...
from import_file import *
from import_file import example
可以使用“*”导入导入文件中的所有内容,也可以导入特定的内容

/main\u file.py的示例

import example
import ...
from import_file import *
from import_file import example

你说的自动是什么意思?我不必做
导入A.B
,但当我在blender中激活加载项时,它会自动导入。然后你应该提供更多关于模块结构的信息,或者阅读一些有关该主题的教程。F.i.
init.py
应改为
\uuuuuuuuuuuuuuuuuuuu.py
。此外,还不清楚
A
是否是模块或子模块的一部分。有更高级别的模块吗?您希望在何处导入子模块?你说的自动是什么意思?Python无法猜测您想要导入什么,您必须至少在一个位置指定导入。那么什么是自动的呢?你是对的,文件是
\uuuu init\uuuuu.py
,这是一个打字错误。我对这个问题做了一些修改。Blender正在导入模块。现在我希望A能够导入B,B是A的一个子目录,其中包含另一个
\uuuu init\uuuu.py
文件。我在想,如果不是迫切需要的话,可以在ADon't do starred imports的子目录中进行迭代!嗯,这不是自动的。我必须创建一个包含所有导入的子模块文件。我不能让python查看当前文件的子目录(
A/\uuu init\uuuuuuuuuuuupy
)并自动调用与模式匹配的文件上的函数(
A/B/\uuuuuu init\uuuuuuuuuupy
),我肯定不会这样做。当你这样做的时候,如果你改变一行,你永远不知道会发生什么。只需查看第二行的
导入此