手动导入python中的包和子模块给出其名称

时间:2016-05-04 07:53:01

标签: python python-3.x

我有这个问题,不知道如何有效地解决它。

我有这个档案结构

手抄本的人数或所有人都不知道,

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输出)

任何帮助?

0 个答案:

没有答案
相关问题