
Java 与 Python 数据交互
发布日期:2021-05-07 13:15:38
浏览次数:32
分类:原创文章
本文共 3851 字,大约阅读时间需要 12 分钟。
开发环境及工具:
java 环境 :JDK 1.8
Python环境:Python 3.7 (安装anaconda自带的python版本)
Anaconda环境: conda 4.5.11
Maven环境: Maven 3.6.3
开发工具:
IDEA 2020.3.2
Pycharm 2019.2
Postman
本文是以Spring Boot项目来完成Java与Python的数据操作的。
方法一 执行简单的Python代码
第一步 添加依赖
在pom.xml文件中加入以下内容,并联网下载。
<!--Jython--><dependency> <groupId>org.python</groupId> <artifactId>jython-standalone</artifactId> <version>2.7.2</version></dependency>
第二步 编写Controller
TestController.java
@RestController@RequestMapping("test")public class TestController { @RequestMapping("hello") public void printHello(){ PythonInterpreter interpreter = new PythonInterpreter(); interpreter.exec("list = [5,2,3,9,4,6]"); interpreter.exec("print(sorted(list))"); }}
第三步 启动程序,发起请求
通过Postman发起请求,将下面请求路径相应的位置做下修改即可。
输出结果:
方法二 Jython执行Python文件
第一步 编写Python文件
用记事本或者Pycharm等编写代码
add.py
def add(a,b): return (a+b)
第二步 编写Controller
@RequestMapping("showMsg") public void showMsg() { PythonInterpreter interpreter = new PythonInterpreter(); interpreter.execfile("D:\\pythonPro\\add.py"); // 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型 PyFunction pyFunction = interpreter.get("add", PyFunction.class); int a = 15, b = 20; /** * 调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的"Python的类型" * Python 是一个弱类型语言,对数据类型会进行隐式转换,在Java中定义好类型再传入 */ PyObject pyObject = pyFunction.__call__(new PyInteger(a), new PyInteger(b)); //多个参数逗号拼接 System.out.println("the answer is : " + pyObject); }
第三步 启动程序并访问
访问:
运行结果:
方法三 通过Runtime调用python脚本
第一步 编写test.py文件
import numpy as nplist2 = [[1,2,3],['a','b','c']]print(np.array(list2))
查看当前python 安装的库:
pip list
这里用到了 numpy库,如果没有这个库可以手动安装:
pip3 install -i https://mirrors.aliyun.com/pypi/simple numpy
第二步 编写Controller
@RequestMapping("testpy") public void testpy() { Process process; //package java.lang; 这个包 不要导入错了 try { // 模仿控制台运行py文件 python + 文件名 process = Runtime.getRuntime().exec("python D:\\pythonPro\\test.py"); // 用输入输出流来显示结果 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null; // 按行读取 while ((line = bufferedReader.readLine()) != null) { System.out.println(line); } // 记得关闭流 bufferedReader.close(); process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } }
注:
process = Runtime.getRuntime().exec("python D:\\pythonPro\\test.py");
这里 python 不要漏掉了,是一条执行命令
漏掉会出现错误:
第三步 启动程序并访问
Postman访问
输入结果:
四 参数传递
在实际的应用场景中,我们可能会在Python程序中传递参数。
第一步 修改一下 add.py文件
import sys def add(num1,num2): return (num1+num2) if __name__ == '__main__': mylist = [] for i in range(1, len(sys.argv)): mylist.append((int(sys.argv[i]))) print(add(mylist[0],mylist[1]))
第二步 编写Controller
@RequestMapping("testArgs") public void testArgs(){ int num1 = 15; int num2 = 52; try { /** * 其中args是String[] { “python”,path,url1,url2 }; * path是python程序所在的路径,url1是参数1,url2是参数2,以此类推。 */ String[] args = new String[] { "python", "D:\\pythonPro\\add.py", String.valueOf(num1), String.valueOf(num2) }; Process proc = Runtime.getRuntime().exec(args);// 执行py文件 BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = null; while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); proc.waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } }
第三步 启动程序并访问
Postman访问
运行结果:
以上就是常用的java 与Python数据交互方式。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月10日 13时16分52秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux中使用awk命令
2019-03-06
如何使用google搜索?
2019-03-06
Redis分布式锁的正确实现方式
2019-03-06
设计模式-抽象工厂模式
2019-03-06
IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
2019-03-06
IDEA 调试Java代码的两个技巧
2019-03-06
Vue 数组和对象更新,但视图未更新,背后的故事
2019-03-06
剑指Offer面试题:9.二进制中1的个数
2019-03-06
《你是在做牛做马还是在做主管》- 读书笔记
2019-03-06
重新温习软件设计之路(4)
2019-03-06
MySQL数据库与python交互
2019-03-06
python如何对字符串进行html转义与反转义?
2019-03-06
开发小白也毫无压力的hexo静态博客建站全攻略 - 躺坑后亲诉心路历程
2019-03-06
golang基础--类型与变量
2019-03-06
.NetCore外国一些高质量博客分享
2019-03-06
解决WebRTC中不同的浏览器之间适配的问题
2019-03-06
深入理解JavaScript函数
2019-03-06