从Python中的子文件夹递归加载所有模块
我有以下文件结构从Python中的子文件夹递归加载所有模块,python,python-2.7,Python,Python 2.7,我有以下文件结构 ./AppFolder __init__.py main.py ./plugin __init__.py ./simple_plugin_1 __init__.py simple_plugin_1.py ./simple_plugin_2 __init__.py simple_plugin_2.py
./AppFolder
__init__.py
main.py
./plugin
__init__.py
./simple_plugin_1
__init__.py
simple_plugin_1.py
./simple_plugin_2
__init__.py
simple_plugin_2.py
我想将所有插件模块递归加载到main.py中。因此,我可以在AppFolder中使用\uuuu init\uuuuuuuuuuupy
,如下所示
import os
import glob
__all__ = [ os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(__file__)+"/plugin/*/*.py")]
还是有其他技术 我有一段代码用于此目的,只需将其用作您的顶层
\uuuu init\uuuuuuuuy.py
:
import pkgutil
__all__ = []
for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
module = loader.find_module(module_name).load_module(module_name)
exec('%s = module' % module_name)
__all__.append(module_name)
基本上与您的想法相同,但只需使用
pkgutil.walk\u包
来查找所有模块,而不是文件glob。我认为这是一个非常好的选择,但我会添加一个startswith(“''')
,除非您想加载所有\uu init\uuuuuuuuuuy
文件。如何?你能给我一个提示吗?或者,如果您有答案,您可以发布它吗?@Phoneix您正在f(文件名)上迭代,所以类似于的东西,如果不是os.path.basename(f).StartWith(“\uuuuIx”)
,同样,这不是必须的,您的代码仍然很好。