简介
Python 作为一种灵活的软件开发语言在当今被广泛使用. 在软件开发过程中, 有时需要在 Python 项目中利用既有的 Java 代码, 已达到节省时间和开发成本的目的. 因此, 找到一个 Python 代码调用 Java 代码的桥梁是非常有意义的. JPype 就是这样的一个工具, 利用它可以使 Python 程序方便的调用 Java 代码.
JPype 使 Python 可以完全访问 Java 类库. Jython/JPython 重新实现了 Python,JPype 则提供了两个虚拟机的接口. JPype 可以在 JSP,Servlet,RMI 服务器和 IDE 插件都方面用 Python 代替 Java.
缺陷:
package 之外的类 (在 < default > 中) 不能被导入.
不能重启 JVM.
不能处理依赖当前类的方法.
快速入门
安装
- #!python
- # pip3 install jpype1
- Collecting jpype1
- Downloading JPype1-0.6.2.tar.gz (147kB)
100% |████████████████████████████████| 153kB 519kB/s
- Building wheels for collected packages: jpype1
- Running setup.py bdist_wheel for jpype1 ... done
- Stored in directory: /root/.cache/pip/wheels/8e/f3/e6/a1250b8e8d2bd105f4dd21b1dc801dbcf5d815592443bfe741
- Successfully built jpype1
- Installing collected packages: jpype1
- Successfully installed jpype1-0.6.2
线程的启动需要增加: jpype.attachThreadToJVM(), 可以使用 isThreadAttachedToJVM() 检查. 使用 java 线程要注意这里不支持回调. 基于 OS 的线程通常问题不大, 但是仿真线程, 比如 microthread, 在 java 中实际为一个线程.
java 的 synchronized 同步, jpype 用 synchronized(O)实现, 返回 monitor 对象. monitor 为 GCd 时会破坏锁.
Jpype 使用 JNI, 它并不是最有效的接口. 并且 Jpype 桥接两个完全不同的实时环境, 需要来回转换, 性能一般.
在 java 中使用 $ 来区分内部类和外部类. 例如内部类 Foo 定义在 Bar 内部, 在 java 中称为 Bar.Foo, 但此时其真正的名字为 Bar$Foo.
由于上述名字变异, 你不能使用标准的包访问方式来获取它们. 使用 JPackage 的方法 getclass 来载入.
非静态内部类不能从 python 代码中实例化. 但是可以完全没有问题地使用从 java 代码中接受到的实例.
演示:
- #!python
- $ ipython3
- Python 3.5.2 (default, Nov 23 2017, 16:37:01)
- Type 'copyright', 'credits' or 'license' for more information
- IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
- In [1]: from jpype import *
- In [2]: startJVM(getDefaultJVMPath(), "-ea")
- In [3]: java.lang.System.out.println("hello world")
- hello world
- In [4]: shutdownJVM()
- JVM activity report :
- classes loaded : 31
- JVM has been shutdown
参考资料
- https://pypi.python.org/pypi/JPype1
- https://GitHub.com/originell/jpype
旧网址: http://jpype.sourceforge.NET/
https://GitHub.com/jlizier/jidt/wiki/Downloads
来源: http://www.jianshu.com/p/fdd0680ac90f