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的工程化性能,可以使开发更加高效。

  • 相关阅读:
    python 执行sql得到字典格式数据
    python爬虫 url链接编码成gbk2312格式
    windows环境下elasticsearch安装教程(单节点)
    python SQLServer 存储图片
    爬虫的本质是和分布式爬虫的关系
    requests form data 请求 爬虫
    mysql 删除 binlog 日志文件
    查看mysql数据表的大小
    xshell 连接报错 Disconnected from remote host
    centos 7.3 安装 mysqldb 报错 EnvironmentError: mysql_config not found ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
  • 原文地址:https://www.cnblogs.com/fanghao/p/7745356.html
Copyright © 2011-2022 走看看