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
相关产品推荐
相关产品推荐

