1

目前我做这样的事情:

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% 信任用户。

谢谢,斯托拉斯

4

1 回答 1

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中引入了元组形式。

于 2013-08-20T09:49:57.490 回答