package_path = '/home/foo/bar/'
module_class = 'hello.World'
method = 'something'
首先,我要导入hello
模块 package_path
(/home/foo/bar/
)
然后,我必须在此模块中实例化类World
最后我应该在新的 world_instance_object
上运行something()
方法
有任何想法吗?
非常感谢你!
答案 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)()