从动态导入调用动态方法

时间:2018-07-21 10:44:34

标签: python dynamically-generated globals python-importlib

我面临一个新挑战: 我的项目是这样组成的:

./Passive

  /meteo

    meteomanager.py # contain a function called meteomanager(param)

 /cinema

    cinemamanager.py # contain a function called cinemamanager(param)

 ...etc

我在每个子文件夹中都有一个_init__.py文件,并且我有50多个这样的子文件夹(文件夹是我项目中的一个模块)。 因此,为了动态收集所有模块,我使用importlib.import_module()获取所有库。在每个模块中,我都有一个“ MY_MODULE” manager.py(上面的示例)。因为我只知道我必须使用的模块的名称(例如,只是“ meteo”或“ cinema”),所以必须在参数中传递函数meteomanager(例如)的名称。

我想使用(例如):

myModToUse = importlib.import_module('Passive.meteo.meteomanager')
globals()[myModToUse.__name__+'meteomanager'](param)

但是它不能正常工作,我有一个错误:

globals()myModToUse。名称 +“ meteomanager” KeyError:'Passive.meteo.meteomanager.meteomanager'

我不了解发生了什么以及如何解决和正确使用它。 需要帮助:)

下面是我的代码:

def get_modules():
    modules = []
    projectFolder = './Passive/'
    for module in os.listdir(projectFolder):
        if os.path.isdir(projectFolder+module):
            modules.append(projectFolder+module)
    return modules

dicModules = {}
for modulePath in get_modules():
    module = modulePath.split('/')[-1]
    try:
        dicModules[module] = importlib.import_module('Passive.'+module+'.'+module+'manager')
        print('module',module,'IMPORTED')
    except Exception as e:
        print('for module',module,'-->',e)
  # I obtain the name I have to use
  moduleToUse = get_module_to_use()
  # I obtain the param I have to give
  paramToGive = get_param_to_give()
  globals()[dicModules[moduleToUse].__name__+moduleToUse+'manager'](paramToGive)

0 个答案:

没有答案