使用exec动态更新模块并在Python中编译

时间:2014-11-08 22:49:37

标签: python compilation exec imp

我想动态导入和更新模块。使用importlibimp.reload as suggested by abarnet的方法可能更有效。但另一种解决方案是使用execcompile。我在下面有一个示例脚本,演示了如何在运行中调用和使用存储在字符串中的模块。但是,当我在函数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())

- 编辑: 如果您认为不值得问我,请告诉我如何改进这个问题。不要只是投票。感谢。

1 个答案:

答案 0 :(得分:0)

在函数test中,虽然FRUIT是局部变量,但我们无法直接访问它。要访问FRUIT,应将另一个容器dict_obj传入exec,然后我们可以使用该容器从该容器访问已执行的类。一个工作示例如下所示。

def test():
    dict_obj = {}
    exec(get_code_object(),dict_obj)
    a = dict_obj["_class_name"]()
    print(a.get_fruit())