在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等 ...
随机推荐
- 封装basedao及动态创建新类型的java数组
package com.huawei.base; import java.io.Serializable;import java.lang.reflect.Array;import java.lang ...
- Kafka集群中 topic数据的分区 迁移到其他broker
前言 kafka集群扩容后,新的broker上面不会数据进入这些节点,也就是说,这些节点是空闲的:它只有在创建新的topic时才会参与工作.除非将已有的partition迁移到新的服务器上面:所以需要 ...
- mysql的my.ini配置文件
第一步,我们找到mysql安装文件下面的my.ini文件,打开可以看到第一句: # MySQL Server Instance Configuration File Mysql服务实例配置文件 好,咱 ...
- react native android 真机调试
http://localhost:8081/index.android.bundle?platform=android 晕死,设备掉线了 C:\Users\ZHONGZHENHUA\.android\ ...
- RabbitMQ EasyNetq 用法
EasyNETQ帮助类 public class MQHelper { /// <summary> /// 发送消息 /// </summary> public static ...
- Red Hat 6.5 Samba服务器的搭建(匿名访问,免登录)
搭建Samba服务器是为了实现Linux共享目录之后,在Windows可以直接访问该共享目录. 现在介绍如何在红帽6.5系统中搭建Samba服务. 搭建Samba服务之前,yum源必须配置好,本地源和 ...
- vscode安装dlv插件报错:There is no tracking information for the current branch.
vscode安装dlv插件报错:There is no tracking information for the current branch. https://blog.csdn.net/a7859 ...
- GC Roots的理解以及如何判断一个对象为“垃圾”
http://blog.csdn.net/Great_Smile/article/details/49935307 这篇博客中讲解了哪些可以作为GC Roots以及如何判断一个对象为垃圾
- 汉诺塔(hanoi)
汉诺塔代码: def hanoi(n,x,y,z): if n == 1: print(x,'-->',z) else: hanoi(n-1,x,z,y) print(x,'-->',z) ...
- 设计模式(java)--中介者模式之同事的关联
转自:http://blog.csdn.net/zhengzhb/article/details/7430098 定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使 ...