代码之家  ›  专栏  ›  技术社区  ›  Joyal Mathew

对用户输入使用exec()/compile()

  •  1
  • Joyal Mathew  · 技术社区  · 6 年前

    如果我用 compile() exec() 要执行用户输入的某些代码,代码中定义的函数或变量能否在外部再次使用?
    例如:

    code = ""
    while 1:
        line = input("")
        if line == "":
            break
        code += line
    
    exec(compile(code, "code", "exec"))
    print(test()+1)
    

    这不会再回来了 6 就像我预料的那样。它给人一种感觉 NameError 但是编译或执行代码没有问题。如果代码只是一个字符串而不是输入,则没有错误。有什么方法可以使用这个函数吗 test() ?

    1 回复  |  直到 6 年前
        1
  •  0
  •   blhsing    6 年前

    变量名解析和作用域是在编译时完成的,因此如果在运行时使用 exec ,则需要使用 locals()

    exec(compile(code, "code", "exec"))
    print(locals()['test']()+1)