• 使用 jpype 库实现 Python 调用 java 的 jar 包中的功能


    一、what's the JPype

      JPype 是一个能够让 python 代码方便地调用 Java 代码的工具。在某些时候 java 的能力更强,我们可以用 java 写一个模块的功能然后用 Python 去调用。当然相应的也可以反着来,Java 使用 jython 调用Python

    JPype与Jython(JPython后继者)的区别?

    • 运行环境不同:jython 运行在 jvm 上,而JPype 的实际运行环境仍然是 python runtime,只是在运行期间启动了一个嵌入的jvm;
    • 使用者不同:jython 用于 Java ,JPype 用于 Python。

    JPype安装

      本人尝试过直接使用 pip3 install JPype1-py3 的形式,但貌似这样安装的版本不是很好,建议使用 wheel 进行安装

    下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

      在网页中找到 jpype,我使用的版本是 Python3,下载的 wheel 是 JPype1‑0.6.3‑cp36‑cp36m‑win_amd64.whl

    pip install xxx.wheel
    pip install numpy # jpype 依赖于 numpy 

    二、Java 的安装及 IDE 的安装

      最好是 jar 文件在本地打包,本地开发,所以需要有 Java 的环境。不需要安装的自行跳过。

    注意:Python 和JDK 版本需要一致,比如都是 64 bit

    配置 Java 环境

    1. 下载 JDK 文件版,本要大于1.7,官网:http://www.oracle.com/,然后傻瓜式安装
    2. 配置系统变量 JAVA_HOME:变量名 JAVA_HOME,值为 jdk 所在目录
    3. 配置系统变量 CLASSPATH:变量名 CLASSPATH,值为 ;%JAVA_HOME%lib;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar
    4. 配置环境变量 PATH:%JAVA__HOME%in;%JAVA_HOME%jrein
    5. cmd 中输入 java -version 能看到版本号就说明 OK 了

    安装 IDE

    • 下载 eclipse,官网:http://www.eclipse.org/downloads/
    • 下载完成后,打开,File→new→java project,取消默认勾选的项目,点击finish
    • 右键src,new→class,输出name,写一个 Java 的小脚本(演示的脚本文件命名为 JpypeDemo.java)
      public class JpypeDemo {
      public int calc(int a, int b) {
          return a+b;
      }
      
      public static void main(String[]args) {
          JpypeDemo JpypeDemo = new JpypeDemo();
          int a =JpypeDemo.calc(1,2);
          System.out.print(a);
      }
      }

    将 Java 脚本打包成 jar 包

    1. 将 Java 脚本编译成 class 文件
      javac JpypeDemo.java # 会生成一个class文件
    2. 打包成 jar 包
      jar cf Demo.jar JpypeDemo.class

    使用 JPype

    import jpype
    import os
    
    JVM_path = r"C:Program FilesJavajdk1.8.0_221jreinserverjvm.dll" # jvm.dll 是必须的,在jdk文件夹jreinserverjvm.dll下
    jarpath =r'C:UserszhuminghuiDesktopdemo_testDemo.jar' # 生成的 jar 包路径
    
    Djava = "-Djava.class.path="+jarpath
    jpype.startJVM(JVM_path,"-ea",Djava)
    jpype.java.lang.System.out.println("HelloWorld") # 测试调用 Java 的环境 print
    JDClass =jpype.JClass("JpypeDemo") # jar 包中,Java 脚本中定义的类
    jd = JDClass() # 实例化
    print(jd.calc(1,2)) # 调用方法
    # 关闭JVM
    jpype.shutdownJVM()

     注意:jvm 只能启动一次,关闭一次,否则会报错。

    坑点记录

    如果 Java 脚本第一行声明了 package,在调用 JClass 实例化的时候需要做下更改

    package aaa
    public class JpypeDemo {
    public int calc(int a, int b) {
        return a+b;
    }
    
    public static void main(String[]args) {
        JpypeDemo JpypeDemo = new JpypeDemo();
        int a =JpypeDemo.calc(1,2);
        System.out.print(a);
    }
    }
    import jpype
    import os
    
    JVM_path = r"C:Program FilesJavajdk1.8.0_221jreinserverjvm.dll" # jvm.dll 是必须的,在jdk文件夹jreinserverjvm.dll下
    jarpath =r'C:UserszhuminghuiDesktopdemo_testDemo.jar' # 生成的 jar 包路径
    
    Djava = "-Djava.class.path="+jarpath
    jpype.startJVM(JVM_path,"-ea",Djava)
    jpype.java.lang.System.out.println("HelloWorld") # 测试调用 Java 的环境 print
    JDClass =jpype.JClass("aaa.JpypeDemo") # jar 包中,Java 脚本中定义的类
    jd = JDClass() # 实例化
    print(jd.calc(1,2)) # 调用方法
    # 关闭JVM
    jpype.shutdownJVM()
  • 相关阅读:
    关于Allele(等位基因)的理解
    beta 分布的详细介绍(转载)
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
  • 原文地址:https://www.cnblogs.com/zhuminghui/p/11778617.html
Copyright © 2020-2023  润新知