spring boot读取resources目录下的python脚本执行

简介: spring boot读取resources目录下的python脚本执行

一、问题描述


如何在spring boot工程中,通过java代码调用执行存放在resources目录下的python脚本?


二、分析


1、要执行python脚本,服务器上一定要配置对应的python执行环境。

2、spring boot工程中resources目录下的python文件只能通过流读取出来,然后保存为临时文件,才能调用python脚本执行命令。


三、代码实战


64.png


test.py的内容:

#!/usr/bin/python3
import sys
print ('参数个数为:', len(sys.argv), '个参数。')
print ('参数列表:', str(sys.argv))
print ('脚本名:', str(sys.argv[0]))
print("Hello, World!")


/**
 * @Description python执行工具类
 */
@Slf4j
public class PythonUtil {
    /**
     * 执行脚本
     */
    public  static void exec(String path, List<String> params) throws Exception {
        //InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
        InputStream inputStream = PythonUtil.class.getClassLoader().getResourceAsStream(path);
        File somethingFile = File.createTempFile("test", ".py");
        String filePath = null;
        String commond = null;
        try {
            FileUtils.copyInputStreamToFile(inputStream, somethingFile);
            filePath = somethingFile.getAbsolutePath();
            log.info("文件路径:{}",filePath);
            Runtime runTime = Runtime.getRuntime();
            commond = "python3 " + filePath;
            if(params!=null && params.size()>0){
                commond += " " + params.stream().collect(Collectors.joining(" "));
            }
            log.info("执行脚本[{}]",commond);
            Process proc =  runTime.exec(commond);
            BufferedReader bfr = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line = "";
            while ((line = bfr.readLine()) != null) {
                log.info(line);
            }
            proc.waitFor();
        } catch (Exception e) {
            log.error("脚本[{}]执行失败",commond);
            e.printStackTrace();
        }finally {
            IOUtils.closeQuietly(inputStream);
            //删除临时文件
            somethingFile.deleteOnExit();
        }
    }
    /**
     * 无参方法
     */
    public  static void exec(String path) throws Exception {
        exec(path,null);
    }
    public static void main(String[] args) throws Exception {
        List<String> params = new ArrayList<>();
        params.add("参数1");
        params.add("参数2");
        params.add("参数3");
        PythonUtil.exec("test.py",params);
    }
}

执行结果:

63.png


四、其他方式


Jython在执行普通py脚本时速度很慢,而且在含有第三方库(requests, jieba…)时bug很多,不易处理。 原因在于,python执行时的sys.path和Jython的sys.path路径不一致,以及Jython的处理不是很好。


<!--Maven依赖,jar包自行前往仓库下载-->
<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
    <version>2.7.0</version>
</dependency>

1. 直接执行Python脚本代码


1 PythonInterpreter interpreter = new PythonInterpreter();  
2 interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");


2. 执行python .py文件


PythonInterpreter interpreter = new PythonInterpreter();  
 InputStream filepy = new FileInputStream("D:\\demo.py"); 
 interpreter.execfile(filepy);  ///执行python py文件
 filepy.close();


3. 使用Runtime.getRuntime()执行脚本文件

这种方式和.net下面调用cmd执行命令的方式类似。如果执行的python脚本有引用第三方包的,建议使用此种方式。使用上面两种方式会报错java ImportError: No module named arcpy。


Process proc = Runtime.getRuntime().exec("python  D:\\demo.py");  
proc.waitFor();


其中,方式一和方式二都依赖Jython,对有第三方依赖的脚本执行不友好,且实现效率较慢,所以更推荐方案三用cmd执行命令的方式。

目录
相关文章
|
5月前
|
JSON 算法 API
深度分析小红书城API接口,用Python脚本实现
小红书作为以UGC内容为核心的生活方式平台,其非官方API主要通过移动端抓包解析获得,涵盖内容推荐、搜索、笔记详情、用户信息和互动操作等功能。本文分析了其接口体系、认证机制及请求规范,并提供基于Python的调用框架,涉及签名生成、登录态管理与数据解析。需注意非官方接口存在稳定性与合规风险,使用时应遵守平台协议及法律法规。
|
5月前
|
JSON API 数据安全/隐私保护
【干货满满】分享微店API接口到手价,用python脚本实现
微店作为知名社交电商平台,其开放平台提供商品查询、订单管理等API接口。本文介绍如何通过微店API获取商品到手价(含优惠、券等),涵盖认证机制、Python实现及关键说明。
|
5月前
|
JSON API 数据安全/隐私保护
【干货满满】分享淘宝API接口到手价,用python脚本实现
淘宝开放平台通过API可获取商品到手价,结合商品详情与联盟接口实现优惠计算。需使用AppKey、AppSecret及会话密钥认证,调用taobao.tbk.item.info.get接口获取最终价格。代码示例展示签名生成与数据解析流程。
|
5月前
|
JSON API 数据格式
深度分析大麦网API接口,用Python脚本实现
大麦网为国内领先演出票务平台,提供演唱会、话剧、体育赛事等票务服务。本文基于抓包分析其非官方接口,并提供Python调用方案,涵盖演出列表查询、详情获取及城市列表获取。需注意非官方接口存在稳定性风险,使用时应遵守平台规则,控制请求频率,防范封禁与法律风险。适用于个人学习、演出信息监控等场景。
|
5月前
|
JSON API 开发者
深度分析阿里妈妈API接口,用Python脚本实现
阿里妈妈是阿里巴巴旗下营销平台,提供淘宝联盟、直通车等服务,支持推广位管理、商品查询等API功能。本文详解其API调用方法,重点实现商品推广信息(佣金、优惠券)获取,并提供Python实现方案。
|
5月前
|
JSON API 数据安全/隐私保护
深度分析虾皮城API接口,用Python脚本实现
虾皮开放平台提供丰富的API接口,支持商品管理、订单处理及促销信息查询等功能。本文详解API认证机制与调用方法,基于Python实现商品价格及到手价获取方案,适用于电商数据分析与运营。
|
5月前
|
JSON API 数据安全/隐私保护
【干货满满】分享拼多多API接口到手价,用python脚本实现
拼多多开放平台提供商品价格查询API,通过“pdd.ddk.goods.detail”接口可获取商品基础价、优惠券、拼团价等信息。结合client_id、client_secret及签名机制实现身份认证,支持推广位ID获取专属优惠。本文提供完整Python实现,涵盖签名生成、接口调用与价格解析逻辑,适用于比价工具、导购平台等场景。
|
5月前
|
API 数据安全/隐私保护 开发者
深度分析苏宁API接口,用Python脚本实现
深度分析苏宁API接口,用Python脚本实现
|
5月前
|
前端开发 Shell API
深度分析58同城API接口,用Python脚本实现
58同城为国内知名分类信息平台,涵盖房产、招聘、二手车等多领域。本文基于网页抓包与解析,分享其非官方接口的Python实现方案,分析核心接口特性与反爬应对策略,适用于数据学习与信息聚合。注意:非官方接口存在风险,使用需遵守平台规则。
|
5月前
|
JSON API 数据安全/隐私保护
【干货满满】分享京东API接口到手价,用python脚本实现
淘宝开放平台提供丰富API,通过商品详情接口与淘宝联盟接口,可获取含优惠券、满减后的商品到手价。本文介绍基于Python的实现方案,涵盖签名生成、接口调用、价格解析及错误处理,适用于比价工具、导购平台等场景。

推荐镜像

更多