zoukankan      html  css  js  c++  java
  • Python的JAVA胶水——jpype

    Python的JAVA胶水——jpype

    python可以作为一门胶水语言使用,可以用其它语言的优势来弥补自身如性能方面的不足,jpype就是在Python中使用jvm的第三方库

    文档在这里

    安装

    sudo pip jpype1 #注意后面有一个1,参考官网
    

    配置安装JAVA环境本文就不再赘述

    helloworld

    • 设置参数启动JAVA虚拟机
    • 运行JAVA代码
    • 关闭虚拟机
    #coding=utf=8
    
    import jpype
    
    jvmPath = jpype.getDefaultJVMPath() # 获得系统的jvm路径
    jpype.startJVM(jvmpath=jvmPath) # 启动虚拟机
    # 执行JAVA代码
    jpype.java.lang.System.out.println("hello world")
    jpype.shutdownJVM() # 关闭jvm
    
    -------------------------------------------
    hello world
    JVM activity report     :
    	classes loaded       : 31
    JVM has been shutdown
    

    使用Java中的对象

    jpype还支持直接使用编译后的class文件,省去了编译这一环节。

    一下是原来的JAVA测试代码

    package com;
    public class JavaClass
    {
        String value;
        public JavaClass(String value)
        { 
            this.value = value+" Java"; 
        } 
        public String getValue()
        { 
            return this.value;
        }
        public void say()
        {
            System.out.println("hello java");
        }
        public static void main(String[] args) {
            System.out.println("hello world");    
        }
     }
    

    编译后产生JAVA字节码

    java -cp com  com.JavaClass
    

    现在的文件结构如下

    ./
    ├── com
    │   └── JavaClass.class
    └── testJava.py

    Python代码如下:

    #coding=utf=8
    
    import jpype
    
    jvmPath = jpype.getDefaultJVMPath() # 获得系统的jvm路径
    # 启动虚拟机
    if not jpype.isJVMStarted():
        jpype.startJVM(jvm=jvmPath)
    # 使用JAVA字节码中定义的类
    javaClass = jpype.JClass('com.JavaClass')
    # 实例化对象
    javaInstance = javaClass('test')
    #调用JAVA对象的方法
    print javaInstance.getValue()
    javaInstance.say()
    
    # 关闭jvm
    jpype.shutdownJVM()
    
    -------------------------------------------
    test Java
    hello java
    JVM activity report     :
    	classes loaded       : 20
    JVM has been shutdown
    

    添加jar包

    原TestApi.java代码

    package test;  
      
    public class TestApi  
    {  
        public String getData(String key){  
            return key;  
        }  
        public void printData(String key){  
            System.out.println(key);  
        }  
          
        public static void main(String[] args)  
        {  
            System.out.println(123);  
        }  
    }
    

    打包成jar后可以使用Python来调用

    #coding=utf-8
    
    import jpype
    
    jvmPath = jpype.getDefaultJVMPath()
    
    # 用来添加JAVA虚拟机命令行参数
    ext_classpath = './TestApi.jar'
    jvmArg = '-Djava.class.path=' + ext_classpath
    
    if not jpype.isJVMStarted():
        jpype.startJVM(jvmPath, jvmArg)
        TA = jpype.JPackage('test').TestApi #这种用法可以简化后面的书写
        jd = TA()
        jd.printData('1234')
        s = jd.getData('a')
        print s
        system = jpype.java.lang.System #这里也是获得了System
        system.out.println("call system method")
    jpype.shutdownJVM()
    

    此例中,同时还使用了JAVA虚拟机启动时的命令行参数,可以订制启动方式

    小结

    jpype提供了强大而灵活的JAVA虚拟机接口,使得Python的扩展性进一步提升,Python的优雅语法,配上JAVA的工程化性能,可以使开发更加高效。

  • 相关阅读:
    用例失败重新运行
    pytest启动浏览器,失败用例截图
    解决pycharm问题:module 'pip' has no attribute 'main'
    pytest的HTML
    pytest 的 yield
    pytest的setup和teardown
    pytest的fixture和conftest
    pycharm运行pytest
    简单易用的MongoDB
    快速入门系列--CLR--02多线程
  • 原文地址:https://www.cnblogs.com/fanghao/p/7745356.html
Copyright © 2011-2022 走看看