贴吧百度发帖老被说广告总是被删,也没发广告,是为什么了?

2637人阅读
jpype(3)
python(9)
JPYPE用户手册小译
By Jetway from hdu_cloud
1、&&&&&&&&&&& 概述
JPype是为了python程序能完全访问java类库而开发的。它并不是将像Jython/JPython那样重新用python实现java类库,而是通过两个虚拟机之间的接口实现的。
为什么要开发JPype呢?开发者认为尽管他自身对python编程非常深入,但他并不能否认java的市场占有率。比如sourceforge中就包含了3267个与python相关的项目和12126个与java相关的项目(没算上商业用途的项目)。并且在服务器端python的非常弱小的,就算是Zope,还是比不上java在服务器的应用上的地位。于是为了同时使用这两种语言,开发者搞了这个项目。
那么Jython又如何?Jython不错,但是有很多缺点,比如,它比CPython慢,并且不允许访问大部分Python扩展库。
看一个JPype使用的例子:
from jpype import *
& startJVM(&d:/tools/j2sdk/jre/bin/client/jvm.dll&, &-ea&)
& java.lang.System.out.println(&hello world&)
& shutdownJVM()
这是一个简单的helloworld程序,不过显示了最重要的两个调用:startJVM和shutdownJVM。下一节将详细介绍。
2、&&&&&&&&&&& 线程
此处唯一的问题是保证java线程和python线程正确的交互,感谢上苍,这个实现起来不难。
Python线程。唯一要注意的只有调用线程内的jpype.attachThreadToJVM(),这样的话JVM就可用了。对于那些不是你自己启动的线程,你可以调用ThreadAttachedToJVM()来检测。
Java线程。因为没有回调机制,当前无法使用java创建的线程。
同步(一致性)。Java同步(一致性)机制可以分为两种:第一种,同步(一致)的关键字,诸如一个方法的前缀和一个方法内部的语句块;第二种,对象类中不同的方法(notify,notify all,wait)。为支持同步(一致性)功能,jpype定义了一个synchronized(O)方法,O必须是一个java对象或者java类或者相当于一个对象的java包(JString和JObject)。此方法的返回值是一个monitor对象,它将在对象O的整个生命周期中保持其一致性(同步)。
3、&&&&&&&&&&& 性能
Jpype使用JNI,它并不是最有效的接口。并且Jpype桥接两个完全不同的实时环境,需要来回转换。这两个都可能引入巨大的性能瓶颈。
JNI是标准的适用于大部分JVM的本地化接口,要减少JNI负担只能将一部分代码转移到java中。
要减少转换负担,可以对那些给定(一个字符串,一个对象,一个数组等等)并且经常传入java的对象,你可以使用wrappers一次性预转换他们。
4、&&&&&&&&&&& 内部类
大部分内部类可以像普通类一样使用,只是有以下区别:
在java中使用$来区分内部类和外部类。例如内部类Foo定义在Bar内部,在java中称为Bar.Foo,但此时其真正的名字为Bar$Foo。
由于上述名字变异,你不能使用标准的包访问方式来获取它们。使用JPackage的方法_getclass_来载入。
非静态内部类不能从python代码中实例化。但是可以完全没有问题地使用从java代码中接受到的实例。
5、&&&&&&&&&&& 数组
Jpype完全支持接受java数组并传递java方法给这些数组。Java数组(打包成JArray包类),其行为很像python列表(list),当然了java数组大小是固定的,而python列表大小是可变的。多维数组也可以很好的在python中运行。
从python中创建java数组。创建java数组用的是JArray方法,代码形式如下:
JArray(type, num_dims)(sz or sequence)
Type是java(String或java对像)类或者包类型。Num_dims是数组大小,默认为1.。sz数组中元素的真实数目。Sequence是初始化数组的序列。JArray(type, ndims)返回的是一个数组类,可以通过此类来生成实例。
6、&&&&&&&&&&& 类型转换
JPype这个桥接系统中最麻烦的应该是找到python类型和java类型之间的无缝转换。下表列出了转换明细。
其中:none表示无法转换;Explicit(E)表示JPype可以转换成想要的类型,但是只针对与Wrapper类。也就是wrapper类将作为一个参数方位此类型。Implicit(I)表示JPype可以按需转换。Exact&(X),类似implicit,但是当决定哪个方法负载时,exact比implicit具有更高的优先级。
(1)&&& 如果Python值符合java本地值类型,转换就会发生。
(2)&&& 如果python string或者unicode的长度是1,转化发生
(3)& 所要求的对象必须与java.lang.String (java.lang.Object,parable)兼容。
(4)&&& 维数必须能配对,并且类型必须兼容。
(5)&&& 只有当所要求的类型为java.lang.Object
(6)&&& 只有当JObject包的详细类型为一个可兼容的数组类。
(7)&&& 只有当所要求的类型与包的详细类型兼容。实际的java对象并不考虑。
(8)&&& 只有当所要求的类型与java对象的实际类型兼容
(9)&&& 只有当所要求的类型是java.lang.Object或者java.lang.Class
(10)只有当值True和False明确的转换成boolean时。
从java转换到python:
Java的byte,short和int转换成python的int
Java的long转换成python的long
Java的float和double转换成python的float
Java的boolean转换成python int&#
Java 的char转换成python 中长度为1 的unicode
Java的String转换成python的unicode
Java的数组转换成JArray
所有的java对象转换成JavaObject
Java类转换成JavaClass
Java数组类转换成JavaArrayClass
7、&&&&&&&&&&& JProxy
JProxy的构造函数使用2个参数。第一个参数是一个或者一组(a sequence of)JClass对象,定义要实现的接口。第二个参数必须是一个关键字参数(keyword argument),并且必须是一个dict或者inst。如果dict指定,那么第二个参数必须是一个字典,带关键字的方法名为定义的接口,而且值为可调用的对象。如果inst是一个给定对象实例(定义的给接口修饰的方法)。
当然在python中子类别化java类是不一样的。
样例代码:
假设java接口如下:
public interface ITestInterface2
&&&&&&&&&&&&&& int testMethod();
&&&&&&&&&&&&&& String testMethod2();
你可以创建一个代理并实现此接口,有两种方法,第一种使用类:
&&&&&&&&&&&&&& def testMethod(self) :
&&&&&&&&&&&&&&&&&&&&&& return 42
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&& def testMethod2(self) :
&&&&&&&&&&&&&&&&&&&&&& return &Bar&&&&&&
&&&&&&& c = C()
&&&&&&& proxy = JProxy(&ITestInterface2&, inst=c)
第二种使用字典:
def _testMethod() :
&&& &&& return 32
&&&&&&& def _testMethod2() :
&&& &&& return &Fooo!&
&&&&&&&&&&&&&&
&&&&&&& d = {
&&&&&&&&&&&&&& 'testMethod' : _testMethod,
&&&&&&&&&&&&&& 'testMethod2' : _testMethod2,
proxy = JProxy(&ITestInterface2&, dict=d
8、&&&&&&&&&&& java异常
python异常是扩展类,在表面上与java类差不多(常规类),但是python异常与常规python类完全不同,这导致了完全直接的捕获java异常是不可能的。
所有的抛出的java异常都会结束于抛出jpype.JavaException异常。你可以接下来使用message(), stackTrace() 和javaClass()来访问扩展信息。例子如下:
&&&&&&& try :
&&&&&&&&&&&&&&&&&&& # Code that throws a java.lang.RuntimeException
&&&&&&&&& except JavaException, ex :
&&&&&&&&&&&&&&&&&&& if JavaException.javaClass() is java.lang.RuntimeException :
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& print &Caught the runtime exception : &, JavaException.message()
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& print JavaException.stackTrace()
你可以直接使用JException来捕获真正的java异常:
&&&&&&& try :
&&&&&&&&&&&&&&&&&&& # Code that throws a java.lang.RuntimeException
&&&&&&&&& except jpype.JException(java.lang.RuntimeException), ex :
&&&&&&&&&&&&&&&&&&& print &Caught the runtime exception : &, JavaException.message()
&&&&&&&&&&&&&&&&&&& print JavaException.stackTrace()
9、&&&&&&&&&&& 已知的局限性
卸载JVM。JNI API中定义了destroyJVM()的方法,但是由于Sun公司的JVM不允许卸载,此方法形同虚设。所以当你在shutdownJVM()之后尝试着再次调用startJVM(),你将会受到一个不明确的(non-specific)异常。JPype中并没有出错。
方法依赖于现存的类。Java库中有一些方法依赖于寻找调用类时的信息。如果直接从python代码中调用会出错。JNI API没有提供类似的方法。
A.&&&& Module Reference
startJVM()方法。此方法必须必须在任何jpype features被使用前调用。返回值为None。异常,RuntimeException。参数:
vmPath& jvm.dll或者jvm.so(这个看具体平台的)的路径。
misc arguments& 可选,可以通过此参数将任何命令行参数传递给JVM。
shutdownJVM()方法。没有参数,返回值None。异常RuntimeException。
attachThreadToJVM方法。大部分情况下不用调用,jpype module会自动执行。没有参数,返回值None,异常为RuntimeException
isTreadAttachedToJVM方法。这个也是不大用调用的。参数没有,返回值None,异常RuntimeException。
detachThreadFromJVM方法。不太需要手动调用。参数没有,返回值None,异常RuntimeException
synchronized方法。不太需要手动调用。参数没有,返回值None,异常RuntimeException
JPackage类。此包允许结构化方位java包和类。只需要在JPackage中声明包树的根(the root of the package tree)。例如:
要导入w3c DOM包:Document = JPackage(‘arg’).w3c.dom.Document
Wrapper classes。封装java类和方法到python中的主要问题在于,java允许重载一个方法。大部分情况下是没什么问题的。大部分重载的方法有不一样的参数并且不会发生冲撞。
当jpype不能决定调用哪个重载的方法时,用户必须解决这个歧义。于是就可以引入wrapper类了。例子为java.io.PrintStream类,它有两种可变的方法print和println。
对于以下代码,Jpype会自动的选择println(int)方法。
from jpype import *
&startJVM(&d:/tools/j2sdk/jre/bin/client/jvm.dll&, &-ea&)
&java.lang.System.out.println(1)
&shutdownJVM()
改过之后:
from jpype import *
&startJVM(&d:/tools/j2sdk/jre/bin/client/jvm.dll&, &-ea&)
&java.lang.System.out.println(JByte(1)) # &--- wrap the 1 in a JByte
&shutdownJVM()
告诉jpype选择byte类型,但是这个wrappered类型要求必须与要求类型兼容,于是使用JByte wrapper来请求一个int会失败。
(到此为止吧,jetway水平有限,但是若要转载或使用此文,请挂上jetway的名字啊嘿嘿——原文地址:http://jpype.sourceforge.net/doc/user-guide/userguide.html)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:50377次
排名:千里之外
原创:26篇
评论:13条
(1)(2)(1)(3)(2)(7)(6)(1)(1)(5)(2)(1)4994人阅读
python(8)
Python 作为一种灵活的软件开发语言在当今被广泛使用。在软件开发过程中,有时需要在 Python 项目中利用既有的 Java 代码,已达到节省时间和开发成本的目的。因此,找到一个 Python 代码调用 Java 代码的桥梁是非常有意义的。 JPype 就是这样的一个工具,利用它可以使 Python 程序方便的调用 Java 代码,从而扩充 Python 语言的能力,弥补 Python 语言的不足。本文介绍了如何利用 JPype 整合 Python 程序和 Java 程序的一些基本方法。
JPype 是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足。
JPype 可以从 sourceforge 网站上下载:&目前 JPype 最新的版本为 0.5.4,支持 python 2.5 和 2.6. 本文以 Windows XP 平台,python 2.5.4 为例阐述。
安装 JPype 前需要先安装 python 。从&&下载 python 并安装,安装路径选择 C:\Python25\,安装完成后在本地 C 盘应有 C:\Python25 目录,该目录下有 python.exe 文件。 Python 安装完后,双击下载的 JPype 安装文件即可安装 JPype 。
JPype 遵循的许可证是 Apache License V2.0 。
hello world 程序
下面是一个简单的 python 程序,通过 JPype 调用 Java 的打印函数,打印出字符串。
1. hello world
import jpype
&jvmPath = jpype.getDefaultJVMPath()
&jpype.startJVM(jvmPath)
&jpype.java.lang.System.out.println( “ hello world! ” )
&jpype.shutdownJVM()
JPype 提供的 startJVM() 函数的作用是启动 JAVA 虚拟机,所以在后续的任何 JAVA 代码被调用前,必须先调用此方法启动 JAVA 虚拟机。
·&&&&&&&&jpype.startJVM() 的定义
startJVM(jvm, *args)
·&&&&&&&&&
·&&&&&&&&jpype.startJVM() 的参数
参数 1: jvm, 描述你系统中 jvm.dll 文件所在的路径,如“ C:\ProgramFiles\IBM\Java50\jre\bin\j9vm\jvm.dll ”。可以通过调用 jpype.getDefaultJVMPath() 得到默认的 JVM 路径。
参数 2: args, 为可选参数,会被 JPype 直接传递给 JVM 作为 Java 虚拟机的启动参数。此处适合所有合法的 JVM 启动参数,例如:
&-agentlib:libname[=options]
&-classpath classpath
2. jpype.startJVM() 的用法示例
import jpype
&jvmPath = jpype.getDefaultJVMPath()
&jvmArg = “ -Xint ”
&jpype.startJVM(jvmPath,jvmArg)
JVM 是否启动
JPype 提供的 jpype.isJVMStarted() 函数的作用是判断 JVM 是否已启动。
·&&&&&&&&jpype.isJVMStarted() 的定义&
isJVMStarted()
·&&&&&&&&jpype.isJVMStarted() 的返回值
返回值为 True 表示 JVM 已经启动,返回值为 False 表示 JVM 还未启动
3.jpype.isJVMStarted() 的用法示例
import jpype
&jvmPath = jpype.getDefaultJVMPath()
&jvmArg = “ -Xint ”
&if not jpype.isJVMStarted():
&&& jpype.startJVM(jvmPath,jvmArg)
当使用完 JVM 后,可以通过jpype.shutdownJVM() 来关闭 JVM,该函数没有输入参数。当 python 程序退出时,JVM 会自动关闭。
Java 扩展包
很多时候,在 python 项目中需要调用第三方的 Java 扩展包,这也是 JPype 的一个重要用途。为了使编程者方便地在 python 代码中调用已有的 Java 扩展包,我们可以再在 JVM 启动参数增加:
-Djava.class.path=ext_classpath
以下为调用第三方 Java 扩展包示例,(假设第三方 Java 扩展包的所在路径是 E:\JavaExt)
4. 调用第三方 Java 扩展包示例
import jpype
&jvmPath = jpype.getDefaultJVMPath()
&ext_classpath = “ E:\\JavaExt ”
&jvmArg = “ -Djava.class.path = ” + ext_classpath
&if not jpype.isJVMStarted():
&&& jpype.startJVM(jvmPath, jvmArg)
Java 的系统属性
有时,某些 Java 应用需要设置或者获取 JVM 中的系统属性。
·&&&&&&&&在 JVM 启动时设置系统变量示例:
·&&&&&&&&在 JVM 的启动参数中加入如下参数:
-Dproperty=value&
假设你要设置的属性名为 yourProperty,属性值为 yourValue 。
5. JVM 启动时设置系统变量示例
import jpype
&jvmPath = jpype.getDefaultJVMPath()
&jvmArg = “ -DyourProperty=yourValue ”
&if not jpype.isJVMStarted():
&&& jpype.startJVM(jvmPath,jvmArg)
6. 在程序中设置系统变量示例
import jpype
&prop = “ yourProperty ”
&value = “ yourValue ”
&system = jpype.JClass('java.lang.System')
&system.setProperty(str(prop),str(value))
7. 在程序中获取系统变量示例
import jpype
&prop = “ yourProperty ”
&system = jpype.JClass('java.lang.System')
&value = system.getProperty(str(prop))
类型到 python 类型的转换
1. Java 类型到 python 类型的转换
转换成的 python 类型
byte, short and int
float and double
int of value 1 or 0
unicode of length 1
other Java object
JavaObject
array Class
JavaArrayClass
使用 Java 对象
8. Java 类定义
&public class JavaClass {
&&& public String value = &&;
&&&& * Creates a new JavaClass object.
&&&& * @param value
&public JavaClass(String value) {
&&&&&&& this.value =
&&& public String getValue() {
&&&&&&& return this.
&&& public void setValue(String val) {
&&&&&&& this.value =
对于上述的 Java 类,以下的代码介绍了如何在 Python 中构造并且使用相应的对象。首先是获得对应 Java 类:
9. 获得对应 Java 类
import jpype
&javaClass = jpype.JClass('.ibm.javaproject.JavaClass')
调用 Java 类的构造函数生成实例:
10. 调用 Java 类的构造函数生成实例
value = “ oldvalue ”
&javaInstance = javaClass(value)
调用 Java 方法:
11. 调用 Java 方法
print javaInstance.getValue()
&javaInstance.setValue( “ newvalue ” )
&print javaInstance.getValue()
运行结果:
12. Python 代码的运行结果
异常处理是程序编写者们必须考虑的问题,在使用 JPype 的过程中,所有的 Java exception 将被自动转换成 jpype.JavaException 。以下是 Jpype 处理 Java exception 的示例:
13. 处理 Java exception
from jpype import JavaException
&&& #Code that throws a java.lang.RuntimeException
&except JavaException, ex:
&&& if JavaException.javaClass() is java.lang.RuntimeException:
&&&&&&& print &Caught the runtime exception : &, JavaException.message()
&&&&&&& print JavaException.stackTrace()
Password Cipher)
下面我们用一个简单的应用实例来说明如何在 python 代码中调用 Java 类。
假设我们已用 Java 语言编写了一个类:PasswordCipher,该类的功能是对字符串进行加密和解密。它提供了一个对外的接口 run() 函数,定义如下 :
14. PasswordCipher 定义
public class PasswordCipher {
&&& public static String run(String action, String para){
run 函数接收两个参数,第一个参数代表所要进行的操作,传入“ encrypt ”表示对第二个参数 para 做加密操作,返回加密结果。如果第一个参数为“ decrypt ”则返回对 para 的解密操作的结果。在 run 函数中有可能会有异常抛出。
我们先将 PasswordCipher.class 存放在目录“ F:\test\cipher ”下,然后用 python 语言编写下面的代码:
15. Python 代码
import jpype
&from jpype import JavaException
&jvmPath = jpype.getDefaultJVMPath()&&&&&&&&&& #the path of jvm.dll
&classpath = &F:\\test\\cipher&&&&&&&&&&&& &&&&&#the path of PasswordCipher.class
&jvmArg = &-Djava.class.path=& + classpath
&if not jpype.isJVMStarted():&&&&&&&&&&&&&&&&&&& #test whether the JVM is started
&&& jpype.startJVM(jvmPath,jvmArg)&&&&&&&&&&&& #start JVM
&javaClass = jpype.JClass(&PasswordCipher&)&& #create the Java class
&&& testString = &congratulations&
&&& print &original string is : &, testString
&&& #call the run function of Java class
&&& encryptedString = javaClass.run(&encrypt&, testString)
&&& print &encrypted string is : &, encryptedString
&&& #call the run function of Java class
&&& decryptedString = javaClass.run(&decrypt&, encryptedString)
&&& print &decryped string is : &, decryptedString
&except JavaException, ex:
&&& print &Caught exception : &, JavaException.message()
&&& print JavaException.stackTrace()
&&& print &Unknown Error&
&&& jpype.shutdownJVM()&&&&&&& #shut down JVM
运行该程序后得到的结果:
16. 该程序运行的结果是:
original string is :& congratulations
&encrypted string is :& B0CL+niNYwJLgx/9tisAcQ==
&decryped string is :& congratulations
·&&&&&&&&访问&&的主页,了解更多 JPype 的内容。&
·&&&&&&&&访问 developerWorks&,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
·&&&&&&&&有关 Python 更多信息,请参考 developerWorks 上 Linux 专区的&。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:269225次
积分:3711
积分:3711
排名:第7537名
原创:87篇
转载:145篇
评论:13条
(2)(4)(5)(3)(2)(2)(6)(9)(8)(14)(9)(5)(12)(3)(6)(15)(3)(3)(9)(20)(10)(22)(11)(4)(13)(2)(1)(6)(3)(4)(2)(2)(3)(9)4665人阅读
jpype(3)
python(9)
在安装jpype之前需要安装好python2.6或者python2.5,还有java
然后从&上下载jpype-x.x.x.zip
直接在随便哪个放置这个安装包的目录下:
unzip JPype-0.5.3.zip
cd JPype-0.5.3
python setup.py install
然后,直接在命令行下输入:
&&& import jpype
就会出现如下问题:
/usr/lib64/python2.6/site-packages/jpype/_pykeywords.py:18: DeprecationWarning: the sets module is deprecated
& import sets
据说这是一个bug,这个需要高人指点啊
然后,测试一下到底能不能用,首先我建立了/home/text/zz目录,然后在此目录下编写了一个JavaClass.java的文件,代码如下:
&public class JavaClass {&
& & public String value = &&;&
& & &* Creates a new JavaClass object.&
& & &* @param value&
&public JavaClass(String value) {&
& & & & this.value =&
& & public String getValue() {&
& & & & return this.&
& & public void setValue(String val) {&
& & & & this.value =&
然后将其编译成.class文件:
javac JavaClass.java
产生了JavaClass.class文件
于是我便写了一个test.py文件(也是在此目录下/home/text/zz),代码如下:
#-*- coding:utf-8 -*-
from jpype import *
startJVM(getDefaultJVMPath())
javaClass = JClass(&JavaClass&)
value =&oldValue&
javaInstance = javaClass(value)
print javaInstance.getValue()&
javaInstance.setValue(&newvalue&)&
print javaInstance.getValue()
shutdownJVM()
startJVM用于开启jvm,其第一个参数是JVM库所在的路径(和JAVA_HOME不是一回事儿),通常可以用jpype.getDefaultJVMPath()来自动获取系统默认JVM的路径。如果系统中安装了多个JDK,希望从中选择一个,则可以手动注明这个路径。
然后在命令行下输入:
python test.py
得到如下结果:
/usr/lib64/python2.6/site-packages/jpype/_pykeywords.py:18: DeprecationWarning: the sets module is deprecated
& import sets
JVM activity report & & :
classes loaded & & & : 20
JVM has been shutdown
也就是说貌似还是成功了,无非是多了一个bug,望懂这个bug的高手能看到并告诉小弟一声。
据说此bug是由于:python2.6这个版本已经不推荐使用 sets 这个模块了,但是为了兼容性依然加载了这个模块但是做了警告提示。
采取了最恶劣的方式,修改原文件,进入python安装目录找到如下文件 Python26\Lib64\sets.py,您也可以通过find / -name sets.py来找到sets文件
注释掉 warning的三行,大概是这样的:
#import warnings
#warnings.warn(&the sets module is deprecated&, DeprecationWarning,
# & & &stacklevel=2)
结果再次运行上面的实验发现,应该是成功了:
JVM activity report & & :
classes loaded & & & : 20
JVM has been shutdown
参考网址:
http://bbs./bbstcon?board=Script&reid=
/html/sysadmin/41.html
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:50379次
排名:千里之外
原创:26篇
评论:13条
(1)(2)(1)(3)(2)(7)(6)(1)(1)(5)(2)(1)

我要回帖

更多关于 百度发帖老被说广告 的文章

 

随机推荐