在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等 ...
随机推荐
- 阿里巴巴Java开发规约扫描插件-Alibaba Java Coding Guidelines 在idea上安装使用教程
经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的<阿里巴巴Java开发规约>扫描插件!该插件由阿里巴巴P3C项目组研发.P3C是世界知名的反潜机,专门对付 ...
- System.Diagnostics.Conditional
[System.Diagnostics.Conditional] 指示编译器当特定的宏定义了时,才生成此方法的相应代码.只能应用于AttributeClass.Method. 参考:http://ms ...
- 从Oracle数据库中查询与某一时间点最接近的记录
select * from data_taskregionschedule WHERE regioncode='HYL' and updatetime-to_date('2018-05-15','yy ...
- IDEA05 mybatis插件之MyBatisCodeHelper-Pro
前提准备: >IDEA专业版本 1 安装MyBatisCodeHelper-Pro IDEA提供了插件安装功能,可以根据开发需要安装适合的插件 >help -> find actio ...
- 安装了Anaconda之后,Maya运行报错,Python 找不到 Maya 的 Python 模块
以前Maya用的好好地,结果安装了Anaconda之后,maya启动以后,日志就会报错(如下),只能自主建模,不能打开以前创建的模型,也不能导入fbx,错误提示就是Maya找不到Python模块,在网 ...
- [C++] Pen questions & linux cmd
1.宏替换,完全展开替换,注意带来副作用 #include <stdio.h>#define 打印语句 printf(“hello”); Void main(void) { If (1) ...
- 修复jqgrid setgridparam postdata 的多次查询条件累加
//根据elements查询出的参数个数的不同,而传递不同个数的查询参数 start var elements = node.attributes.text.split(","); ...
- Sql优化,面试经验总结
(1)列优先 如图有表A和表B 对其查询时,会有如下语句: select a.*,b.* from a,b where a.id = b.a_id; 注意from 后边的表名, a.如果多表查询是完全 ...
- Mac上phantomjs装了不能用的解决
下了,装了.然后整这句命令: phantomjs --version 直接报错.. 查了半天的官方文档,居然连个毛线都么找到.终于...墨迹到了一个方法,就抱着试一试的心态在terminal里输入了这 ...
- 基于Xcode5的本地化
一.程序名国际化 1.首先添加应用对多语言支持的国际化文件 点击工程根目录,然后选择PROJECT下的项目,然后选择Info选项卡,在底部可以看到Localizations,点击“+”号,可以 ...