使用自定义本地字典执行Python代码
作为后续工作,我正在尝试像在外部函数的上下文中一样执行Python代码。为此,我只需使用使用自定义本地字典执行Python代码,python,python-3.x,Python,Python 3.x,作为后续工作,我正在尝试像在外部函数的上下文中一样执行Python代码。为此,我只需使用def outer():包装一块代码,并进行一些简单的字符串处理以正确缩进内部代码。然后我编译它并通过执行co_consts列表中的第一个code对象来执行编译后的内部代码 例如: mycode = """ print("Hey!") """ wrapped_code = 'def outer():\n ' + '\n '.join(mycode.strip().split('\n')) com
def outer():
包装一块代码,并进行一些简单的字符串处理以正确缩进内部代码。然后我编译它并通过执行co_consts
列表中的第一个code对象来执行编译后的内部代码
例如:
mycode = """
print("Hey!")
"""
wrapped_code = 'def outer():\n ' + '\n '.join(mycode.strip().split('\n'))
compiled_code = compile(wrapped_code, '<str>', 'exec')
exec(compiled_code.co_consts[0], {}, {})
这将产生:
{}
注意,我显式地将一个包含
{“foo”:“bar”}
的本地dict传递给exec
,但是当它实际执行代码并打印locals()
时,它显示了一个空字典。为什么Python没有使用我传递的局部变量字典?您正在将一个函数作为第一个参数传递给exec。一个函数将定义它自己的局部变量,所以这就是您正在打印的局部变量。去掉包装(我看不出有什么用处),它就可以工作了。“如果有人想知道我为什么要这样做,那是我一直在研究的C扩展模块的一部分。”-这并不能回答问题。我从未见过任何扩展模块会这样做。请参阅和(PyFrame\u New
,693-710)。@eryksun,谢谢。你的评论解决了我的问题。我所需要做的就是将function code对象中的co_flags
变量设置为0
,这样它将使用我传递给它的局部字典,而不是为执行帧创建一个新的局部字典。是否有方法访问/操作函数局部字典?@Channel72:从函数外部,不,因为它是本地的。您找错了方向,应该发布一个关于您实际试图使用exec()解决的问题的问题。您几乎不需要使用exec()。
{}