我有这个问题,不知道如何有效地解决它。
我有这个档案结构
手抄本的人数或所有人都不知道,
app/
__init__.py
modules/
__init__.py
ModuleA/
__init__.py
file.py
otherfile.py
config.ini
ModuleB/
__init__.py
file.py
otherfile.py
config.ini
ModuleC/
__init__.py
file.py
otherfile.py
config.ini
**arbitrary number of modules with same structure*
正如你所知,应用程序是我的应用程序的主要包,但我需要一种有效的方法来导入mods文件夹及其'含量
*我的实际解决方案*
from app import modules ad mods
def load_modules_from_packages(self, pkg = mods):
pkgname = pkg.__name__
pkgpath = dirname(pkg.__file__)
for loader,name,ispkg in pkgutil.walk_packages(pkg.__path__, pkgname+'.'):
if ispkg is True:
__import__(name,globals(),locals(),[],0)
elif ispkg is False:
__import__(name,globals(),locals(),[],0)
这是有效的,因为pkgutil用名称的点表示法迭代结构,因此导入效果很好。
但是现在我想在配置文件中加载信息,如果我在 somemodule 文件夹(具有自己的 init 的文件夹)中。 py和config.ini
我想这样做是为了重新创建模块包的结构,并将其输出为JSON代表另类内容
*我的其他解决方案不起作用*
def load_modules_from_packages(directory)
dir_path = dirname(directory.__file__)
dir_name = directory.__name__
for filename in glob.glob(dir_path + '/**/*.ini', recursive=True):
plugin = {}
plugin['name'] = filename.split('/')[-2]
plugin['path'] = dirname(filename)
plugin['config_file'] = filename
for pyname in glob.glob(dirname(filename)+ '/**/*.py', recursive=True):
importlib.import_module(pyname)
我无法使用此帖子中发布的解决方案 How to import a module given the full path? 由于我不知道模块名称,广告在评论中没有解决方案。
spec = importlib.util.spec_from_file_location('what.ever', 'foo.py')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
我知道' foo.py'但是我无法弄清楚什么是什么'像pkgutil.walk_package那样。
事实上,以这种方式导入的模块的包和名称条目错误。使用这种方法,我无法弄清楚我在文件结构中的位置,以创建模块字典和相关模块(用于JSON输出)
任何帮助?