在Python程序中调用Java代码的实现
《原创不易,转载请标明出处:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html》
前言
开发Python程序,需求中需要用到Java代码,Python作为“胶水”语言能够很好的实现这种需求。具体实现的过程如下:
1.环境准备
2.环境搭建
3.实验
1.环境准备
我实验过的两种搭配,都成功了,其他的搭配方式没有实验过不敢做过多的陈述,这里以搭配一为实验基础进行描述。
搭配一:windows 7(64位)+JDK(32位)+Python(32位)+eclipse+pycharm
搭配二:windows 7(64位)+JDK(64位)+Python(64位)+eclipse+pycharm
光有以上的还不够,还需要一个作为桥梁的工具包,jpype1,这个工具包可以启动jvm,使java代码依然运行在jvm中。
实验过程中使用的各个工具的具体版本如下:
JDK(32位):1.8.0_211
Python(32位):3.7.2
jpype1(32位):0.6.3
eclipse+pycharm是两款开发工具,主要用来编写java和python代码
2.环境搭建
1.这里对JDK还有python的安装不做过多的称述。
2.jpype1的安装:
①:使用python自带的pip安装工具在线安装,发现不能正确安装,提示需要Microsoft Visual C++等,放弃。
②:使用python自带的pip安装工具离线安装,可以正确安装,但是问题来了,离线的安装包在哪里获取?如下链接可以获取,jpype1(32位):0.6.3。
链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype
如图:下载对应自己python版本的离包(可以在cmd中键入 python命令查看python版本)(这里我选择倒数第二个,命名中带有amd64是适应python64位的,没有amd64的是适应python32位的)

得到离线包之后,在cmd中使用命令: pip install 离线包的位置 可以顺利安装。(这里我已经安装过了没有截图,也懒得重新卸载再安装了)
3.实验
工具安装完毕之后,接下来看实验代码如何书写,借助eclipse开发java代码,并打jar包。
①:开发java代码

②:打jar包



经过打jar包之后,获得了jar文件。

③开发python程序
# 引入jpype模块
import jpype
import os if __name__ == '__main__':
"""
基本的开发流程如下:
①、使用jpype开启jvm
②、加载java类
③、调用java方法
④、关闭jvm(不是真正意义上的关闭,卸载之前加载的类)
"""
# ①、使用jpype开启虚拟机(在开启jvm之前要加载类路径) # 加载刚才打包的jar文件
jarpath = os.path.join(os.path.abspath("."), "C:\\Users\\Administrator\\Desktop\\pythoncalljava-1-0-0.jar") # 获取jvm.dll 的文件路径
jvmPath = jpype.getDefaultJVMPath() # 开启jvm
jpype.startJVM(jvmPath,"-ea", "-Djava.class.path=%s" % (jarpath)) # ②、加载java类(参数是java的长类名)
javaClass = jpype.JClass("com.pythoncalljava.JavaClass") # 实例化java对象
# javaInstance = javaClass() # ③、调用java方法,由于我写的是静态方法,直接使用类名就可以调用方法
javaClass.show() # ④、关闭jvm
jpype.shutdownJVM() pass
④运行程序

总结:
1.如果是调用多个jar文件的话,要在jvm启动时指定jar文件路径,
jarpath,jarpath2,jarpath3,jarpath4是jar文件路径。
jpype.startJVM(jvmPath,"-ea", "-Djava.class.path=%s;%s;%s;%s" % (jarpath,jarpath2,jarpath3,jarpath4))
2.实际上没有真正的停止jvm,jvm随着python程序的退出而结束(JVM has been shutdown是指卸载之前加载的类。)

在Python程序中调用Java代码的实现的更多相关文章
- PL/SQL程序中调用Java代码(转)
主要是学习PL/SQL调用JAVA的方法. 平台:WINDOWS 1.首先使用IDE写好需要调用的java代码,再添加"create or replace and compile java ...
- 在scala中调用java代码
详细代码请见https://github.com/lujinhong/scalademo 在scala中调用java代替非常非常简单,直接调用即可 (一)一个简单示例 1.创建一个java类 pa ...
- python 程序中调用go
虽然python优点很多,但是有一个致命的缺点就是运行速度太慢,那么python程序需要一些计算量比较大的模块时一般会调用c或者c++的代码来重写,但是c/c++编写代码代价太高,耗费太多的人力.那么 ...
- JAVAFX 2.0 javascript中调用java代码
现在你已经知道如何在JavaFX中调用JavaScript.在本章中,你将了解到相反的功能——在web页面中调用JavaFX. 大体上的理念是在JavaFX程序中创建一个接口对象,并通过调用JSObj ...
- Delphi XE7的安卓程序如何调用JAVA的JAR,使用JAVA的类?
本文使用工具和全部源码下载: http://download.csdn.net/detail/sunylat/8190765 为什么我们要在Delphi XE7的安卓程序调用JAVA的JAR,使用JA ...
- Java程序中调用Python脚本的方法
在程序开发中,有时候需要Java程序中调用相关Python脚本,以下内容记录了先关步骤和可能出现问题的解决办法. 1.在Eclipse中新建Maven工程: 2.pom.xml文件中添加如下依赖包之后 ...
- python 调用 java代码
一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...
- JPype:实现在python中调用JAVA
一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...
- PySpark 的背后原理--在Driver端,通过Py4j实现在Python中调用Java的方法.pyspark.executor 端一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。
PySpark 的背后原理 Spark主要是由Scala语言开发,为了方便和其他系统集成而不引入scala相关依赖,部分实现使用Java语言开发,例如External Shuffle Service等 ...
随机推荐
- C# 文本文件的读写
// *********************************************************************** // Assembly : XXX // Auth ...
- Android判断Service是否运行
/** * 用来判断服务是否运行. * @param context * @param className 判断的服务名字 * @ret ...
- MenuItem属性
[MenuItem属性] The MenuItem attribute allows you to add menu items to the main menu. The MenuItem attr ...
- SpringBoot28 RabbitMQ知识点、Docker下载RabbitMQ、SpringBoot整合RabbtiMQ
1 RabbitMQ知识点 1.1 整体架构图 消息生产者将消息投递到exchange中,exchange会以某种路由机制将生产者投递的消息路由到queue中,消息消费者再从queue中获取消息进行消 ...
- MAXOS 进程管理
ps -ef|grep +程序名 注意进程名区分大小写 linux上进程有5种状态:1. 运行(正在运行或在运行队列中等待)2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)3. 不可中 ...
- CentOS 6.5 下安装 Sun JDK 1.7
下载 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 得到 jdk-7u51-l ...
- EZOJ #258
传送门 分析 我们考虑一个点有多少中情况可以被删除 我们发现只有删除它自己和删祖先共$dep_i$中 所以每个点的答案就是$\frac{1}{dep_i}$ 代码 #include<iostre ...
- code1043 方格取数
第一次走用dfs枚举每种情况,第二次走用dp求剩下的最大值 设一个点集q用来保存有价值的点,排序,在最后加一个终点:x=m+1,y=m+1,v=0 //m是矩阵长宽 因为v=0的点是没有意义的,所以 ...
- spring.net 继承
. <object id="parent" type="Bll.Parent, HRABLL" > <property name=" ...
- twitter集成第三方登录是窗口一直出现闪退的解决方法
需要创建自己的token,如下图