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

如何在Python API中执行任意代码并保留返回值(供Java调用)

优雅执行Python代码并获取返回值的解决方案

针对你的场景(从Java调用Python库,规避Jython版本限制与C/C++嵌入的复杂度),以下是几个比exec()存变量更简洁可控的实现方式:

1. 用eval()直接执行表达式

如果仅需执行单个表达式(比如计算、单函数调用),eval()可以直接返回结果,无需额外变量赋值:

# 计算表达式
result = eval('10 + 20')
print(result)  # 输出30

# 调用自定义函数
def add(a, b):
    return a + b
result = eval('add(5, 3)')
print(result)  # 输出8

注意:eval()仅支持表达式,无法执行多行语句,适合简单场景。

2. 自定义上下文隔离的exec()封装

要执行多行代码并获取返回值,可以通过自定义局部字典隔离执行环境,自动捕获最后一行结果:

def run_code(code):
    locals_dict = {}
    # 在代码末尾自动将最后一个表达式的结果存入指定变量
    code += '\n__result__ = _'
    exec(code, globals(), locals_dict)
    return locals_dict.get('__result__')

# 测试多行代码
code = '''
def multiply(a, b):
    return a * b
multiply(4, 5)
'''
result = run_code(code)
print(result)  # 输出20

这种方式不会污染全局变量,同时支持任意多行代码的执行与结果返回。

3. 用ast模块实现安全可控的执行

如果需要规避代码注入风险、更精细地控制执行逻辑,可以通过ast模块解析代码,自动处理结果捕获:

import ast

def safe_run(code):
    tree = ast.parse(code, mode='exec')
    # 检查最后一行是否为表达式,若是则转为赋值语句
    if isinstance(tree.body[-1], ast.Expr):
        assign_node = ast.Assign(
            targets=[ast.Name(id='__result__', ctx=ast.Store())],
            value=tree.body[-1].value
        )
        tree.body[-1] = assign_node
    # 编译执行
    compiled = compile(tree, filename='<temp>', mode='exec')
    locals_dict = {}
    exec(compiled, globals(), locals_dict)
    return locals_dict.get('__result__')

# 测试复杂代码
result = safe_run('''
x = 15
y = 25
x * y - 50
''')
print(result)  # 输出325

这种方式可以进一步扩展(比如过滤危险节点、限制可调用函数),适合安全性要求较高的场景。

针对Java调用的额外建议

你可以把这个Python执行逻辑封装成HTTP接口(比如用FastAPI或Flask),Java通过发送HTTP请求传递代码或函数参数,Python执行后返回JSON格式结果。这种跨语言调用方式简单可靠,无需复杂的嵌入操作。

示例(FastAPI):

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class CodeReq(BaseModel):
    code: str

@app.post("/run")
def run_code(req: CodeReq):
    try:
        res = safe_run(req.code)
        return {"success": True, "result": res}
    except Exception as e:
        return {"success": False, "error": str(e)}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:37:48