【问题标题】:Can not call dynamically imported python modules无法调用动态导入的python模块
【发布时间】:2014-09-12 12:28:19
【问题描述】:

我无法在 python 中访问动态导入的模块。

要么我的调用语法错误,要么导入无法正常工作。

stackoverflow.com 上有很多主题涉及动态导入 Python。然而,我采用了这个网站的代码:https://www.daniweb.com/software-development/python/code/238387/really-simple-plugins-loader-import-all-modules-in-a-folder-in-one-swoop

它会自动导入文件夹中存在的所有模块并返回一个字典。

代码:

import glob, imp
from os.path import join, basename, splitext

def importPluginModulesIn(dir):
    return dict( _load(path) for path in glob.glob(join(dir,'[!_]*.py')) )
def _load(path):
    name, ext = splitext(basename(path))
    return name, imp.load_source(name, path)

modules = importPluginModulesIn('modules_folder')
print modules

输出表明导入成功:

{'test_function': <module 'test_function' from 'modules_folder/test_function.py'>}

然而,建议的访问方法根本没有产生任何响应(应该打印:“测试完成。”)

modules['test_function'].__name__

任何人有任何建议如何解决这个问题? 谢谢!

编辑: Martijn Pieters 让我意识到我实际上弄错了模块和函数。 (见下面的 cmets。) 现在我的问题是如何在我的代码框架内实际调用嵌入到模块中的 test_function test_function.py?

编辑2: modules_folder中test_function.py的内容:

import time

def test_function():  
    print('Start.')
    time.sleep(1)    
    print('Test complete.')

【问题讨论】:

  • 模块已导入;为什么您希望模块名称为Test complete.in 模块中的什么会改变模块名称?
  • 'Test complete'是test_function的打印输出,不是它的名字!
  • 对,但是你有一个模块,而不是一个函数!而您正在尝试访问该模块对象的__name__,这是模块名称,而不是任何函数输出。
  • 好的,我知道那是不准确的。现在如何调用模块 test_function.py 中的 test_function(.py 文件可以是模块,还是带有 init.py 的文件夹?)

标签: python python-2.7 plugins import


【解决方案1】:

尝试做:

for name in modules:
    getattr(modules[name], name)()

它应该可以正常工作。

【讨论】:

  • 谢谢。但这不起作用 - 由于:KeyError:'test_function'。它也违背了动态导入的目的,因为我不想硬编码导入函数。
  • test_function.py 的内容是什么?在弄清楚为什么会有KeyError 之后,试试getattr(modules['test_function'], 'test_function')()
  • 接受,谢谢你的回答,Loquacious!我现在可以根据要求动态调用该函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2011-04-17
  • 2023-03-20
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多