Java之调用Python代码
对于一个数据分析方面的工作者来说,最熟悉的语言无疑就是Python了。对于软件开发者而言,Java又是极其重要的工具。那么,一个很自然的问题就是,我们能够在Java中调用Python代码吗?
想要在Java中调用Python代码,有以下两个办法:
- 直接通过Runtime进行调用
- 调用Jython
在Java中如果需要调用第三方程序,可以直接通过Runtime实现,这也是最直接最粗暴的做法,粒度更加粗糙,效率较高,需要安装Python软件。而Jython是Python语言在Java平台的实现,可以理解为一个由 Java 语言编写的 Python 解释器,因此,不需要安装Python软件。它不仅提供了Python的库,同时也提供了所有的Java类,这就使得其有一个巨大的资源库。Jython可以直接调用Python程序中的指定函数或者对象方法,粒度更加精细。但遗憾的是,Jython运行速度并不理想。
接下来,我们将分别介绍以上两种调用方法。
首先是直接通过Runtime调用Python代码。先写个Python代码文件test_argv.py,它位于D盘中,其完整代码如下:
import sys
a = sys.argv[1]
b = sys.argv[2]
print("%s * %s = %s"%(a,b,int(a)*int(b)))
该Python代码接受两个命令行参数,然后输出一个乘法算式。调用的Java代码如下:
package javaCode;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
public class TestPython {
public static void main(String[] args) throws Exception {
Scanner input = new Scanner(System.in);
// 在同一行输入两个数字,用空格分开,作为传入Python代码的命令行参数
System.out.println("Enter two integers(e.g. 12 34): ");
String integers = input.nextLine();
String[] numbers = integers.split(" ");
// 定义传入Python脚本的命令行参数,将参数放入字符串数组里
String cmds = String.format("python D://test_argv.py %s %s",
numbers[0], numbers[1]);
// 执行CMD命令
System.out.println("\nExecuting python script file now.");
Process pcs = Runtime.getRuntime().exec(cmds);
pcs.waitFor();
// 定义Python脚本的返回值
String result = null;
// 获取CMD的返回流
BufferedInputStream in = new BufferedInputStream(pcs.getInputStream());
// 字符流转换字节流
BufferedReader br = new BufferedReader(new InputStreamReader(in));
// 这里也可以输出文本日志
String lineStr = null;
while ((lineStr = br.readLine()) != null) {
result = lineStr;
}
// 关闭输入流
br.close();
in.close();
System.out.println(result);
}
}
从以上代码中,可以发现,我们往Python代码中传入了两个命令行参数(两个整数),通过Java提供的Runtime环境让Python执行程序,最后用Java得到在CMD或shell中的输出流并在Java程序输出,本质上还是Python在处理计算结果。其输出如下图所示:
然后我们将演示如何使用Jython来实现类似上述程序的功能。
Jython的MVN仓库地址为http://mvnrepository.com/artifact/org.python/jython/2.7.1b3, API官方网址为: http://www.jython.org/javadoc/, jar的下载地址为: http://www.jython.org/downloads.html . 下载jython-standalone-2.7.0.jar包,并将其加入到Eclipse的Java Build Path中,如下图:
Java代码如下:
package javaCode;
import org.python.util.PythonInterpreter;
public class TestPython {
public static void main(String args[]) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import sys ");
interpreter.exec("a = input('Enter a:')");
interpreter.exec("b = input('Enter b:')");
interpreter.exec("print('%s * %s = %s' %(a, b, a*b))");
}
}
运行以上程序,结果如下图:
至此,我们成功地用以上两种方法在Java中调用了Python代码。
本次分享到此结束,欢迎大家交流~~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
博客汇总
区块链 比特币原理简介 区块链 区块链-区块结构 以太坊原理简介 以太坊-GHOST协议 Merkle Patrcia Tree原理 MPT的基本操作 搭建以太坊私有链 应用层面 交易系统架构 网关系统架构 抽奖活动的高可用、高并发优化 交易体系-交易、支付、物流、退款退货 事务模板VS声明式事务 任务扫描的架构设计 限流方案 高并发技术 高可用技术 Spring bean初始化原理详解 Ajax跨域解决方案 中间件 Dubbo-多线程通信原理 Dubbo RPC源码解读 RPC原理以及示例 TCC事务原理 RocketMQ实践 RocketMQ原理 Kafka VS RocketMQ VS RabbitMQ Kafka原理 ZAB协议恢复模式-数据同步 ZAB协议恢复模式-leader选举 Zookeeper原理与设计 Zookeeper使用案例 SpringCloud服务治理与负载均衡原理 SpringCloud API网关-Zuul SpringCloud配置中心-Config SpringCloud-Hystrix原理 JVM JVM垃圾收集器 JVM垃圾收集 从JVM角度看...
-
下一篇
Spark 写出MySQL报错,java.sql.BatchUpdateException
spark DataFrame 写出到MySQL时报如下错误: java.sql.BatchUpdateException: Column ‘name’ specified twice at sun.reflect 原因: 写出的DataFrame 表结构和MySQL中创建的表结构不一致, 2个 DataFrame join 后的结果中有两列都是“name”列。 解决: 修改DataFrame写出结构。核心代码如下: val res1: Dataset[Row] = studentInfoDF.join(stu_scoresDF, studentInfoDF.col("name") === stu_scoresDF.col("name")) .filter(stu_scoresDF.col("score") > 80) res1.show(false) import spark.implicits._ val out: Dataset[(String, Int, String)] = res1.map(row => (row.getAs[String](0), row.ge...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 面试大杂烩
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS关闭SELinux安全模块
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL数据库在高并发下的优化方案
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程