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



我想动态导入和更新模块。更有效的方法可能是使用abarnet建议的importlibimp.reload。然而,另一种解决方案是使用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())

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

在函数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())

相关内容

  • 没有找到相关文章

最新更新