Python使用exec从local()调用函数目录

时间:2013-08-20 09:32:49

标签: python eval

目前我这样做:

pyfd = open("some_python_script.py", "r")
src = pyfd.read()
pyfd.close()

exec(src) #Note, also tried eval and execfile, I use read as I do something with it.
locals()["some_function"]("foo", "bar")

它的效果很好,但是当我离开这个函数时,我注意到Globals和Locals都不再具有“some_function”功能了。 (我希望它的垃圾收集)

我的问题是,如何将从某个python文件中读取的代码附加到我的其他代码中?

我知道这是不好的做法和不安全等等。但是我想以我“py2exe”我的主要部分以及我的用户可以附加Python代码的方式来实现它。他可以通过覆盖功能来破坏整个应用程序,但我可以100%信任用户。

谢谢,Stolas

1 个答案:

答案 0 :(得分:2)

  

......当我离开这个职能......

如果在函数中包装exec调用,则它在函数范围内执行。如果您希望它在不同的范围内执行,只需将相应的dict作为参数提供给exec *:

def load_some_script():
    pyfd = open("some_python_script.py", "r")
    src = pyfd.read()
    pyfd.close()

    exec(src, globals())  # execute the code in the global scope


load_some_script()
some_function('foo', 'bare')  # should now be available at module level.

*编辑:

实际上在python2中它不是一个参数,它是元组的第二个元素,只有在python3中它是一个参数,因为exec已成为一个函数而不是一个语句,但为了兼容性,元组形式已经被引入了python2。