【问题标题】:python, instance dynamic module.class from given path package and call dynamic methodpython,来自给定路径包的实例动态module.class并调用动态方法
【发布时间】:2025-12-23 02:55:16
【问题描述】:
package_path = '/home/foo/bar/'
module_class = 'hello.World'
method = 'something'

首先,我想导入hello 模块 它在package_path (/home/foo/bar/) 中的内容

那么,我必须在这个模块中实例化 World

最后我应该在新的 world_instance_object

上运行 something() 方法

有什么想法吗?

非常感谢!

【问题讨论】:

  • 这可以与*.com/questions/67631/…重复
  • 有什么方法可以从路径字符串导入包(不是模块),然后为它们导入module.Class?
  • 包和模块的导入方式相同。类是模块属性,方法是类属性。使用getattr获取对象的属性

标签: python dynamic import load


【解决方案1】:

为了避免操作sys.path 并防止您导入的所有额外模块弄乱sys.modules,我建议为此使用execfile()。像这样的东西(未经测试的代码):

import os.path

def load_and_call(package_path, module_class, method_name):
    module_name, class_name = module_class.split(".")
    module_globals = {}
    execfile(os.path.join(package_path, module_name + ".py"), module_globals)
    return getattr(module_globals[class_name](), method_name, lambda: None)()

如果一个文件将被多次使用(同样,未经测试),您可以添加一些代码来使用字典缓存已解析的对象:

def load_and_call(package_path, module_class, method_name, _module_cache={}):
    module_name, class_name = module_class.split(".")
    py_path = os.path.join(package_path, module_name + ".py")
    module_globals = _module_cache.setdefault(py_path, {})
    if not module_globals:
        execfile(py_path, module_globals)
    return getattr(module_globals[class_name](), method_name, lambda: None)()

【讨论】: