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
- 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
- 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
- #!/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的模块:
- sudo python -m jcc --jar Test.jar --python JCCTest --build --install
3:测试执行:
- python
- >>> import JCCTest
- >>> JCCTest.initJVM(classpath=JCCTest.CLASSPATH)
- >>> 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就是在《梦断代码》里一直描述的那个半死不活的项目。
没有评论:
发表评论