2009年3月16日星期一

python调用java

Jython:

参考网页:http://www.jython.org/

用纯java做的python,项目受python基金会支持,于2009年3月发布了新beta版

缺点:jython不能调用大量外部提供的cPython包

JPype:

参考网页:http://jpype.sourceforge.net/

民间个人开发,支持语言嵌入,支持cPython包,最新版发布于2009年1月。(只是作者的blog的最新篇还是2007年的。。。)

缺点:文档似乎不是很全

JPype演示实例:

1:安装java

首先需要安装JDK 6

sudo apt-get install sun-java6-jdk

之后需要设置默认的java程序

sudo update-alternatives --config java

按照提示输入对应的选项,指定为JDK 6

下面设置

sudo vim /etc/environment

在其中添加如下两行:

CLASSPATH=/usr/lib/jvm/java-6-sun/lib
JAVA_HOME=/usr/lib/jvm/java-6-sun

如果其中已经设置了CLASSPATH和JAVA_HOME,则将其修改为上面的形式

2:安装JPype包

sudo python setup.py install

设置当前用户的JAVA_HOME环境变量,可以在.bashrc中设置:

export JAVA_HOME=/usr/lib/jvm/java-6-sun

3:测试java文件:

Test.java


  1. public class Test{

    public static void main(String[] args){

    System.out.println("hello world!");

    }

    }

编译:$ javac Test.java

运行:$ java Test

其中第一步会产生 Test.class,也是我们下一步测试要用的。


书写第二个java文件,这个文件没有main函数:

JavaHello.java

  1. class JavaHello{

    public JavaHello(){

    }

    public void speak(String msg){

    System.out.println(msg);

    }

    public static void hello(String [] args){

    System.out.println("hello world!");

    }

    }


编译:javac JavaHello.java

产生了 JavaHello.class


下面关键看使用JPype来调用了:

test.py


  1. #!/usr/bin/env python

    #-*- coding:utf-8 -*-

    from jpype import startJVM, getDefaultJVMPath, java, shutdownJVM

    from jpype import JClass, JPackage


    def test_jpype():

    startJVM(getDefaultJVMPath())

    """

    调用java函数

    """

    java.lang.System.out.println("hello world")


    """

    调用main函数

    """

    JavaTest = JClass("Test")

    JavaTest.main(["hello"])


    """

    调用辅助的class

    """

    JavaHello = JClass("JavaHello")

    JavaHello.hello(["hello"])

    j = JavaHello()

    j.speak("hello world!")

    """

    调用包

    """

    Pkg = JPackage("java.lang")

    Pkg.System.out.println("hello world")


    shutdownJVM()


    if __name__ == "__main__":

    test_jpype()

上面的例子分别实现了,调用java原生函数,调用我们自己的class,调用java的package

JCC:


参考网页:http://pypi.python.org/pypi/JCC

1:ubuntu下直接找这个jcc的debian包就好了,或者sudo apt-get install jcc

2:将上面打成的包,Test.jar扩展成python的模块:

  1. sudo python -m jcc --jar Test.jar --python JCCTest --build --install

3:测试执行:

  1. python

  2. >>> import JCCTest

  3. >>> JCCTest.initJVM(classpath=JCCTest.CLASSPATH)

  4. >>> JCCTest.Test.main([""])

遇到的问题:

1:第一次写java代码,完全不知道怎么做,到使用javac编译出了.class文件,才有点头绪(因为这些步骤和python编译出pyc是类似的),其中遇到了CLASSPATH设置不正确的问题,例如在上面执行 java Test可能会报这个错,可能就是CLASSPATH没设置正确的问题,在执行时可以手动指定CLASSPATH,例如:java -cp ./ Test ,这样就指定了CLASSPATH (也就是cp)为当前目录。

2:打包,如果打完的包需要 java -jar xxx.jar 来执行,那么需要包含mainfest信息,先写一个xxx.mf,里面的内容:

Main-Class: Test

(注意其中,Test和冒号之间要有空格,Test后要换行)

然后执行命令:

jar cvfm Test.jar xxx.mf Test.class

这样生成的Test.jar的包才可以用 java -jar Test.jar来执行

3:安装JCC完后,在python中import jcc 总说找不到这个so,找不到那个so,比如libjava.so libjvm.so libverify.so 这些so文件在/usr/lib/jvm/java-6-openjdk/jre/lib/i386(/client)里,在/usr/lib里建立到这些库文件的软连接即可。

结论:

个人建议使用JPype,能使用cPython的包是很关键的,对于以后扩展也很有好处,毕竟cPython的包比Jython的多很多。

如果能集成比较好,以后java的很多有用的工具都可以尝试一下,例如lucence(虽然有了pyLucence),hadoop(这个将来应该会非常有用)

JCC也不错,这个和JPype的最后发布日期都比较远(大概到2007年),不知道这些大虾们还会不会继续维护

其他:

1:Jython其实更多是Java程序员的福音。JPype则是为Python程序员打开了Java之门。 ---某网友

2:网上说的所谓的jpype不稳定 这个是不对的 如果出现问题第一看看自己的代码 第二 看你调用的java的代码 第三看jpype的手册 还有 千万不要在调用jpype的时候在python里使用那个关闭jvm的那个函数 让python运行完自己关闭jvm 不然 。。。 我发现死在那里动不了 呵呵
---某网友

3:JCC被Chandler这个项目使用了,Chandler就是在《梦断代码》里一直描述的那个半死不活的项目。

没有评论:

发表评论