Java程序中调用Python脚本(兼容Windows与Linux)

一,说明

想实现如下功能,项目后端架构是Spring Boot,某个功能需要调用Python脚本来实现,调用Python脚本的功能要兼容Windows和Linux,即可以运行在Windows和Linux两种平台上。

二,Java代码

// 定义一个线程池来读取python脚本的执行结果
private static ExecutorService taskPool = new ThreadPoolExecutor(3, 10, 200L, TimeUnit.MILLISECONDS,new LinkedBlockingDeque<>(200),new ThreadFactoryBuilder().setNamePrefix("thread-python-exec-runner-%d").build());private void execPythonFile(String path, String params) throws MoyaException {// 获得操作系统名称String os = System.getProperty("os.name");String[] args;if (os.startsWith("Windows")) {// 如果当前环境是Windows环境args = new String[]{"cmd.exe", "/c", "python", path, params};} else {// 如果当前环境是Linux环境args = new String[]{"python", path, params};}Process process = null;try {// 执行python脚本process = Runtime.getRuntime().exec(args);// 错误输出流InputStream errorStream = process.getErrorStream();// 正确输出流InputStream inputStream = process.getInputStream();// 开线程来读取执行失败的信息taskPool.submit(() -> {BufferedReader reader = new BufferedReader(new InputStreamReader(errorStream));List<String> list = read(path, reader);log.info("Python Script execute failed, error message:{}", list);});// 开线程来读取执行成功的信息taskPool.submit(() -> {BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));List<String> list = read(path, reader);log.info("Python Script execute success, successful message:{}", list);});// 阻塞进程,等待执行完成int processResult = process.waitFor();if (processResult != 0) {log.error("Python Script error, waitFor is not zero.");throw new MoyaException("已知威胁流生成失败");}} catch (Exception e) {log.error("python script occur error:{}", e);throw new MoyaException("已知威胁流生成失败");} finally {try {// 在finally中关闭正确输出流与错误输出流process.getErrorStream().close();process.getInputStream().close();} catch (IOException e) {log.info("close process stream exception: {}", e);}// 执行完成,销毁Process对象process.destroy();}}
  • 定义读取方法
/*** 读取输出流数据,并以数组形式返回读取结果** @param path   路径* @param reader 缓冲流对象* @return*/private List<String> read(String path, BufferedReader reader) {List<String> resultList = new ArrayList<>();String res = "";while (true) {try {// 读取到null值,跳出循环if ((res = reader.readLine()) == null) break;} catch (IOException e) {log.error("reading python file: {} occur exception: {}.", path, e);}// 将读取结果放入数组集合中resultList.add(res);}return resultList;}

三,Python代码

import sys# 定义一个主函数,作为脚本执行的入口,如果没有主函数,则从第一行开始执行
if __name__ == "__main__":# 获取外部输入参数param = sys.argv[1]print (param)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s-13 存储之secret

Secret 对象类型用来保存敏感信息&#xff0c;例如密码、OAuth 令牌和 ssh key。 敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活 。 Pod 可以用两种方式使用 secret:作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里 当 kubelet 为 pod 拉…

奖学金答辩注意事项

奖学金答辩注意事项 1.PPT制作 注意字数不要太多&#xff0c;一页PPT里面不要堆满了文字。 评审老师主要是来听你演讲和答辩的&#xff0c;而不是来看你的文字叙述的。就算文字有些多&#xff0c;也要尽量以表格的形式呈现&#xff0c;不然看上去就会非常乱。多用图和表&…

github 中关于Pyqt 的module view 操作练习

代码摘自&#xff0c;Pyside6 中的示例代码部分 # -*- coding: utf-8 -*- import sys from PySide6.QtWidgets import * from PySide6.QtGui import * from PySide6.QtCore import * from PySide6.QtSql import QSqlDatabase, QSqlQueryModel, QSqlQuery import os os.chdir(os…

专业144,总分440+,上岸西北工业大学827西工大信号与系统考研经验分享

我的初试备考从4月末&#xff0c;持续到初试前&#xff0c;这中间没有中断。 总的时间分配上&#xff0c;是数学>专业课>英语>政治&#xff0c;虽然大家可支配时间和基础千差万别&#xff0c;但是这么分配是没错的。 数学 时间安排&#xff1a;3月-7月&#xff1a;…

人声分离软件:iZotope RX 10 (WinMac) 中文汉化版

iZotope RX 10是一款在音频修复和增强领域中非常出色的软件。它提供了一套全面的音频问题解决方案&#xff0c;为后期制作专业人员、音频工程师和视频编辑者解决各种棘手问题。 iZotope RX 10的主要特点包括&#xff1a; 声音修复功能&#xff1a;可以去除不良噪音、杂音、吱吱…

使用Python,Xpath获取所有的漫画章节路径,并下载漫画图片生成单个/多个pdf,并进行pdf合并

使用Python&#xff0c;Xpath获取所有的漫画章节路径&#xff0c;并下载漫画图片生成单个/多个pdf&#xff0c;并进行pdf合并 1 效果图2 原理2.1 pa_mh.py获取喜欢的漫画及所有章节2.2 pyImg2pdf.py根据图片生成单个/多个pdf并增加章节提示 3 源码3.1 pa_mh.py获取喜欢的漫画及…

python的pyecharts第三方模块绘制高端统计图表

pyecharts库 python的pyecharts库是一个用于生成 Echarts 图表的python第三方类库&#xff0c;可以绘制很高端的统计图表以便展示数据。 安装方法 pip安装 pip install pyecharts或者github拉取下载安装 git clone https://github.com/pyecharts/pyecharts.git cd pyechar…

业务安全五重价值:防攻击、保稳定、助增收、促合规、提升满意度

目录 防范各类威胁攻击 保障业务的连续性和稳定性 保障业务的合规性 提升企业营收和发展 提升企业满意度和品牌知名度 2023年暑假被“票贩子”和“黄牛”攻陷。他们利用各种手段抢先预约名额&#xff0c;然后加价出售给游客&#xff0c;导致了门票供不应求的局面&#xff…

HDLbits: Fsm ps2

本题目理解起来有点难&#xff0c;要观察题目中给的三个时序图&#xff0c;通过时序图可以发现&#xff0c;状态有四个&#xff1a;byte1、byte2、byte3&#xff0c;还有一个“&#xff1f;”状态。其中&#xff0c;byte1的下一个状态一定是byte2&#xff0c;byte2的下一个状态…

win11的右键菜单改成win10的样子

在终端复制一下命令 reg add “HKCU\Software\Classes\CLSID{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32” /f /ve 回车&#xff0c;会显示成功 再重启资源管理器。这步必须执行&#xff0c;否则是成功的&#xff0c;或者可能重启电脑会成功&#xff0c;但是我没有…

Red Hat 8中安装Python3.8.8和pip3

文章目录 小结问题解决参考 小结 在Red Hat 8.3中成功安装Python3.8.8和pip3。 问题 运行Python返回错误SyntaxError: future feature annotations is not defined&#xff0c;发现的问题是程序要求Python3.8解释器&#xff0c;然而现有安装版本是Python3.6。 解决 分别安…

Apache Tomcat下载安装配置使用超详细

下载安装 tomcat官网 在此我们以Tomcat 9.0.81为例&#xff0c;点击下载压缩包&#xff0c;解压到自己的文件夹。 tar.gz是linux操作系统下的安装版本。zip是windows系统下的压缩版本。Windows Service Installer是windows操作系统下的exe安装版本。 检查是否配置JDK 1.…

ARM架构的基本知识

ARM两种授权 体系结构授权, 一种硬件规范, 用来约定指令集, 芯片内部体系结构(内存管理, 高速缓存管理), 只约定每一条指令的格式, 行为规范, 参数, 客户根据这个规范自行设计与之兼容的处理器处理IP授权, ARM公司根据某个版本的体系结构设计处理器, 再把处理器设计方案授权给…

【广州华锐互动】塔吊多人安拆VR互动培训系统

塔吊多人安拆VR互动培训系统由广州华锐互动制作&#xff0c;是一种基于VR技术的模拟实训系统&#xff0c;专门用于培训塔吊驾驶员和操作员。 在现实生活中&#xff0c;塔吊操作具有一定的危险性&#xff0c;尤其是在培训过程中容易发生意外。而使用VR互动实训系统&#xff0c;学…

项目平台——测试报表的实现(六)

这里写目录标题 一、页面成果图展示二、代码逻辑1、接口封装2、发送接口请求 三、样式设计1、element-plus中表格组件的使用 四、总体代码五、问题解决六、项目首页【执行记录】设计1、导入子组件2、注册子组件3、使用子组件 一、页面成果图展示 二、代码逻辑 1、接口封装 ap…

【C++初阶(二)缺省参数与函数重载】

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

[环境搭建]OpenHarmony开发环境搭建

文章目录 1. 开发工具1.1 虚拟机1.2 Ubuntu镜像 2 虚拟机安装和配置2.1 虚拟机安装2.2 生成SSH KEY2.3 配置国内apt源&更新2.4 sh修改为bash2.5 下载OpenHarmony依赖工具2.6 python软链接2.7 samba配置 3. gitee账号注册4. 配置git和Repo4.1 git配置4.2 Repo 1. 开发工具 …

SpringMVC的拦截器(Interceptor)

拦截器简介 SpringMVC的拦截器Interceptor&#xff0c;主要是对Controller资源访问时进行拦截的基本操作的技术&#xff0c;当然拦截后可以进行权限控制&#xff0c;功能增强等都是可以的。拦截器类似于JavaWeb开发中的Filter&#xff0c;他们之间的区别如下图所示 Filter技术…

数据库:Hive转Presto(四)

这次补充了好几个函数&#xff0c;并且新加了date_sub函数&#xff0c;代码写的比较随意&#xff0c;有的地方比较繁琐&#xff0c;还待改进&#xff0c;而且这种文本处理的东西&#xff0c;经常需要补充先前没考虑到的情况&#xff0c;要经常修改。估计下一篇就可以补充完所有…

当GDB遇到STL

STL是标准模板库&#xff08;Standard Template Library&#xff09;的简称&#xff0c;是C的三大件之一。 ‍‍ Alex是STL的核心设计者。他于1950年出生在莫斯科&#xff0c;后来到美国发展&#xff0c;曾经在Adobe、A9.com等公司工作。在Adobe工作时&#xff0c;他和保罗•麦…