package_path = '/home/foo/bar/'
module_class = 'hello.World'
method = 'something'
首先,我想导入hello
模块package_path
(/home/foo/bar/
)里面的内容
World
然后,我必须在这个模块上实例化这个类
最后我应该something()
在新的world_instance_object上运行该方法
有什么想法吗?
太感谢了!
为了避免不得不操作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)()