我想动态导入和更新模块。更有效的方法可能是使用importlib
和imp.reload
abarnet 所建议的。然而,另一种解决方案是使用exec
and compile
。我在下面有一个示例脚本,它演示了如何动态调用和使用存储在字符串中的模块。但是,当我在函数中调用此模块test
(见下文)时,它不起作用,并给我一条错误消息global name 'FRUITS' is not defined
。我需要一些新鲜的眼睛来指出我为什么这不起作用。谢谢。
module_as_string = """
class FRUITS:
APPLE = "his apple"
PEAR = "her pear"
class foo(object):
def __init__(self):
self.x = 1
def get_fruit(self):
return FRUITS.APPLE
_class_name = foo """
def get_code_object():
return compile(module_as_string, "<string>", "exec")
def test():
exec(get_code_object())
a = eval("_class_name()")
print(a.get_fruit())
if __name__ == "__main__":
# below doesn't work
test()
# below works
exec(get_code_object())
a = eval("_class_name()")
print(a.get_fruit())
- 编辑:如果您认为这个问题不值得问,请告诉我如何改进这个问题。不要只是投反对票。谢谢。