You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合Python的exec()与eval()执行任意代码并返回值?

如何结合exec()与eval()的功能,执行任意代码并返回结果?

核心方案:在eval中调用exec函数

你可以直接在eval()中调用内置的exec()函数(通过__import__("builtins").exec获取),将多行执行代码作为参数传给exec,再在后面跟上要返回的表达式,用分号分隔。这样eval()会先执行exec对应的多行代码,再计算并返回最后一个表达式的结果,完美结合两者的功能,且无需定义新函数,适配Pickle反序列化场景。

适配Pickle __reduce__的示例代码

def __reduce__(self):
    # 1. 定义需要执行的多行代码
    exec_code = """with open("flag.txt", "w") as f:
    f.write("A flag I have left!")"""
    # 2. 定义最终要返回的表达式(这里是重组原始对象的逻辑)
    return_expr = "dict(iter(self.items()))"  # 替换为你实际需要返回的对象表达式

    # 3. 组合成eval可执行的代码,用repr()自动处理字符串转义
    combined_code = f'__import__("builtins").exec({repr(exec_code)}); {return_expr}'

    # 4. 返回eval作为重组函数,参数为组合后的代码
    return eval, (combined_code, ), None, None, iter(self.items())

原理说明

  • __import__("builtins").exec:在eval的上下文里获取内置的exec函数(直接写exec会被eval当作语句,而作为函数调用则是合法的表达式)
  • repr(exec_code):自动将多行代码字符串转义为适合嵌入另一字符串的格式,避免引号冲突
  • 分号分隔两个表达式:eval会按顺序执行,先调用exec执行多行代码,再计算return_expr并返回其结果,正好满足Pickle __reduce__对返回值的要求

注意事项

  • 如果return_expr依赖于exec代码中定义的变量,直接在表达式中引用即可,exec执行的代码会修改当前上下文的全局/局部变量
  • 对于复杂的代码逻辑,确保exec_code的格式正确,换行和缩进要符合Python语法
  • 若代码中包含特殊字符,repr()会自动处理转义,无需手动操作

内容的提问来源于stack exchange,提问作者whatf0xx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:55:32