目前我这样做:
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
答案 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。