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天前
|
Python
自动化微信朋友圈:Python脚本实现自动发布动态
本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
104 60
|
2月前
|
数据采集 监控 数据挖掘
Python自动化脚本:高效办公新助手###
本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
|
24天前
|
数据采集 存储 监控
21个Python脚本自动执行日常任务(2)
21个Python脚本自动执行日常任务(2)
84 7
21个Python脚本自动执行日常任务(2)
|
14天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
71 5
|
1月前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
51 7
|
2月前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
2月前
|
运维 监控 网络安全
自动化运维的崛起:如何利用Python脚本简化日常任务
【10月更文挑战第43天】在数字化时代的浪潮中,运维工作已从繁琐的手工操作转变为高效的自动化流程。本文将引导您了解如何运用Python编写脚本,以实现日常运维任务的自动化,从而提升工作效率和准确性。我们将通过一个实际案例,展示如何使用Python来自动部署应用、监控服务器状态并生成报告。文章不仅适合运维新手入门,也能为有经验的运维工程师提供新的视角和灵感。
|
2月前
|
存储 Python
Python自动化脚本编写指南
【10月更文挑战第38天】本文旨在为初学者提供一条清晰的路径,通过Python实现日常任务的自动化。我们将从基础语法讲起,逐步引导读者理解如何将代码块组合成有效脚本,并探讨常见错误及调试技巧。文章不仅涉及理论知识,还包括实际案例分析,帮助读者快速入门并提升编程能力。
92 2
|
2月前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
101 3
|
2月前
|
缓存 运维 NoSQL
python常见运维脚本_Python运维常用脚本
python常见运维脚本_Python运维常用脚本
33 3