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

如何在Ballerina内部调用Python代码或执行OS命令

Ballerina 调用Python脚本实现方案

Ballerina 无原生直接嵌入调用Python代码的官方能力,当前2201.x稳定版最通用可靠的实现方式是通过ballerina/os标准库执行系统命令调用Python脚本,此前1.x版本的相关API已全部废弃,旧资料无法适配新版。

前置准备

先调整你的Python绘图脚本,使其支持接收命令行参数,执行完成后将生成的PNG文件绝对路径打印到标准输出,示例脚本结构(命名为generate_lap_chart.py):

import sys
import matplotlib.pyplot as plt

if __name__ == "__main__":
    # 读取命令行传入的3个参数
    year = sys.argv[1]
    round_num = sys.argv[2]
    driver_name = sys.argv[3]

    # 原有绘图逻辑
    # ... 省略具体绘图代码 ...

    # 保存PNG到指定目录,建议用固定缓存目录避免临时文件被清理
    output_path = f"/data/chart_cache/lap_{year}_{round_num}_{driver_name}.png"
    plt.savefig(output_path)
    
    # 必须打印最终路径到标准输出,供Ballerina读取
    print(output_path)

注意:给Python脚本分配可执行权限,确保Ballerina运行进程对PNG保存目录有读写权限。

引入依赖

在项目的Ballerina.toml文件中添加os标准库依赖:

[[dependency]]
org = "ballerina"
name = "os"
version = "1.8.0"

版本号可根据你本地安装的Ballerina版本对应调整,兼容所有2201.7.0以上的稳定版。

接口代码实现

替换资源函数中的调用逻辑,通过os:exec执行Python命令,读取标准输出获取PNG路径,完整代码示例:

import ballerina/http;
import ballerina/os;

service / on new http:Listener(8080) {
    resource function get [string year]/[string round]/laps/[string driverName] () returns string|error {
        // 构造命令参数数组,不要手动拼接命令字符串,避免特殊字符转义问题和命令注入风险
        string[] cmd = [
            "python3", // 生产环境建议替换为Python解释器的绝对路径,避免环境变量不一致问题
            "/data/scripts/generate_lap_chart.py",
            year,
            round,
            driverName
        ];

        // 执行命令,可根据绘图实际耗时调整超时时间
        os:ExecResult execRes = check os:exec(cmd, {
            dir: "/data/scripts",
            timeout: 30
        });

        // 脚本执行失败直接返回错误
        if execRes.exitCode != 0 {
            string errLog = string:fromBytes(execRes.stderr).trim();
            return error(string `图表生成失败:${errLog}`);
        }

        // 读取标准输出,去除末尾换行符得到PNG路径
        string graphPath = string:fromBytes(execRes.stdout).trim();

        // 可选校验:确认文件真实存在
        if !check os:isFile(graphPath) {
            return error("图表生成异常,未找到对应输出文件");
        }

        return graphPath;
    }
}

注意事项

  • 生产环境不要用python3这类依赖环境变量解析的命令,直接写Python解释器的绝对路径,比如虚拟环境下的/data/venv/bin/python,避免Ballerina服务运行时的环境变量和你本地shell环境不一致导致找不到命令。
  • 所有命令参数都放在数组里传递,os:exec会自动处理参数转义,不要自己把参数拼成完整命令字符串。
  • 高频调用场景建议给生成的PNG加缓存判断,文件已存在时直接返回路径,不用重复跑脚本绘图。
  • 如果单张图表绘制耗时超过配置的timeout,会被强制中断返回错误,可根据实际情况调大超时阈值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:39:30