使用自定义本地字典执行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

作为后续工作,我正在尝试像在外部函数的上下文中一样执行Python代码。为此,我只需使用
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()。
{}