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

Python计算器开发:如何从exec()中获取返回值与stdout?

实现方案

要实现模拟Python Shell环境并捕获exec执行代码的stdout输出,核心是重定向标准输出流并维护执行上下文,以下是可直接运行的Python 3.5代码实现:

import io
import sys

# 用于保存Shell环境的全局变量,实现状态留存(比如定义的变量可复用)
shell_context = {}

def get_exec_output(code):
    global shell_context
    # 保存原始标准输出,后续要恢复
    original_stdout = sys.stdout
    # 创建内存中的字符串流,用于捕获输出
    output_catcher = io.StringIO()
    sys.stdout = output_catcher

    result = None
    try:
        # 先尝试将输入作为表达式执行(比如"1+2"这类计算式)
        result = eval(code, shell_context)
    except SyntaxError:
        # 如果是语句(比如"print(1+2)"或"a=10"),用exec执行
        exec(code, shell_context)
    finally:
        # 恢复原始标准输出,避免影响后续程序输出
        sys.stdout = original_stdout

    # 获取捕获到的输出内容
    captured_text = output_catcher.getvalue().strip()
    # 优先返回捕获的输出,无输出则返回表达式结果
    return captured_text if captured_text else (str(result) if result is not None else "")

# 计算器主逻辑
while True:
    user_input = input("Problem: ")
    # 支持退出命令
    if user_input.lower() in ["exit", "quit"]:
        break
    output = get_exec_output(user_input)
    print(f'The answer is: {output}.')

关键细节说明

  • 输出捕获:通过io.StringIO替换sys.stdout,将执行代码时的print输出临时存入内存流,执行完成后再提取内容。
  • 上下文维护:用shell_context字典保存每次执行后的全局变量,模拟Python Shell的状态持续性(比如输入a=5后,后续输入print(a+3)能得到正确结果)。
  • 兼容表达式与语句:先尝试用eval处理计算式(直接返回结果),如果是语法错误则用exec处理语句(捕获输出),覆盖用户的两种输入场景。

注意事项

  • 此实现直接执行用户输入的代码,存在安全风险,仅适合本地自用场景。
  • Python 3.5完全支持io.StringIO和sys.stdout操作,无需额外安装依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:30