python,来自给定路径包的实例动态module.class和调用动态方法

时间:2013-09-20 21:43:25

标签: python dynamic import load

package_path = '/home/foo/bar/'
module_class = 'hello.World'
method = 'something'

首先,我要导入hello 模块 package_path/home/foo/bar/

内的内容

然后,我必须在此模块中实例化类World

最后我应该在新的 world_instance_object

上运行something()方法

有任何想法吗?

非常感谢你!

1 个答案:

答案 0 :(得分: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)()