导入使用exec/eval的模块时,是否可让其访问主程序的资源?
问题结论
该需求可以实现。
原代码报错原因
exec 执行代码时默认使用两个命名空间:当前函数的局部命名空间、exec 所在模块的全局命名空间。你示例中的 exec 位于 myExec 模块内,它的全局命名空间是 myExec 模块的作用域,自然找不到主程序中定义的 test 函数。
解决方法
给 exec 显式传入主程序的命名空间即可,修改代码如下:
修改后的myExec.py
def myExec(code, globals_dict=None, locals_dict=None): # 支持传入自定义全局、局部命名空间 exec(code, globals_dict, locals_dict)
修改后的main.py
import myExec def test(): print("ok") # 调用时传入主程序的全局命名空间 myExec.myExec("test()", globals())
运行上述代码会正常输出 ok。
补充说明
- 如果需要同时访问主程序当前上下文的局部变量,可以同时传入
locals(),写法为myExec.myExec("test()", globals(), locals()) exec/eval存在安全风险,如果执行的是不可信的外部输入代码,会触发任意代码执行漏洞,生产环境使用需做严格的安全校验。
内容的提问来源于stack exchange,提问作者pythonian 23
相关产品推荐
相关产品推荐

