Python+Jpype 调用 Java 碰壁全记录
因为在Jython 调用 Java 碰壁全纪录中已经有了“出色”碰壁经历,此处仿照其大致过程
命令行下无差异,Eclipse中略有差异(classpath的设置方式不同所致)
JavaClass 的定义
public class JavaClass {
private String str = "";
public JavaClass() {
this.str = "JavaClass Init";
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
一、命令行模式
1、进入 python 目录,查看当前目录下只有一个JavaClass.java文件
D:\>cd python
D:\python>dir
2012-03-13 09:59 <DIR> .
2012-03-13 09:59 <DIR> ..
2012-03-13 09:59 227 JavaClass.java
1 个文件 227 字节
2 个目录 37,943,169,024 可用字节
2、启动Python命令行模式(Python版本是 2.7)
D:\python>python
3、导入 JavaClass时,提示找不到JavaClass模块
>>> from jpype import *
>>> jvmPath = getDefaultJVMPath()
>>> startJVM(jvmpath)
>>> startJVM(jvmPath)
>>> JavaClass = JClass("JavaClass")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\jpype\_jclass.py", line 54, in JClass
raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
jpype._jexception.ExceptionPyRaisable: java.lang.Exception: Class JavaClass not found
原因:Python中导入的是.class文件,而JavaClass.java尚未编译生成 .class文件
4、Ctrl-Z退出 Python, 编译 JavaClass.java
D:\python>javac JavaClass.java
D:\python>dir
2012-03-13 10:12 <DIR> .
2012-03-13 10:12 <DIR> ..
2012-03-13 10:12 443 JavaClass.class
2012-03-13 09:59 227 JavaClass.java
2 个文件 670 字节
2 个目录 37,943,169,024 可用字节
5、按第2步,再次进入Python模式后导入 JavaClass时未报异常,说明成功导入,简单调用情况如下
D:\python>python
>>> from jpype import *
>>> jvmPath = getDefaultJVMPath()
>>> startJVM(jvmpath)
>>> startJVM(jvmPath)
>>> JavaClass = JClass("JavaClass")
>>> jc = JavaClass()
>>> jc.str // 调用get方法
'JavaClass Init'
>>> jc.str = "JavaClass Set" // 调用set方法
>>> jc.str
'JavaClass Set'
二、eclipse IDE 环境
workplace 是d:\python,项目名称是mython,其结构如下
mython
......
bin
javaDemo
JavaClass.class
pythonDemo
Py2Ja.py
src
javaDemo
JavaClass.java
pythonDemo
Py2Ja.py
1、JavaClass.java同上(但是第一行多了一个package javaDemo的定义)
2、编辑Py2Ja.py如下:
from jpype import *
jvmPath = getDefaultJVMPath()
startJVM(jvmPath)
JavaClass = JClass("javaDemo.JavaClass")
jc = JavaClass()
print jc.str
jc.str = "JavaClass IDE"
print jc.str
shutdownJVM()
测试运行时报异常
Traceback (most recent call last):
File "D:\python\mython\src\pythonDemo\Py2Ja.py", line 4, in <module>
JavaClass = JClass("javaDemo.JavaClass")
File "C:\Python27\lib\site-packages\jpype\_jclass.py", line 54, in JClass
raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
jpype._jexception.ExceptionPyRaisable: java.lang.Exception: Class javaDemo.JavaClass not found
原因:找不到javaDemo是因为“当前路径”下找不到JavaDemo文件或者目录
解决方法:手工添加JVM的启动参数-Djava.class.path ='D:\python\Mython\src
3、再次修改后如下:
from jpype import *
jvmPath = getDefaultJVMPath()
classPath = "f:\workplace\Python\src"
jvmArg = "-Djava.class.path="+classPath
startJVM(jvmPath, jvmArg)
JavaClass = JClass("javaDemo.JavaClass")
jc = JavaClass()
print jc.str
jc.str = "JavaClass IDE"
print jc.str
shutdownJVM()
测试运行时仍然报异常
Traceback (most recent call last):
File "F:\workplace\Python\src\pythonDemo\Py2Ja.py", line 6, in <module>
JavaClass = JClass("javaDemo.JavaClass")
File "C:\Python27\lib\site-packages\jpype\_jclass.py", line 54, in JClass
raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
jpype._jexception.ExceptionPyRaisable: java.lang.Exception: Class javaDemo.JavaClass not found
与2中的异常一样:找不到JavaClass。
原因:我们已经设置了-Djava.class.path ='D:\python\Mython\src,仍然找不到JavaClass,只能说明是找不到JavaClass.class文件
在命令行中第3步中提到Python文件导入的应该是.class文件,在看前面mython项目的整个目录发现,class文件在mython\bin\javaDemo中。也就是说可能是因为编译器找到了JavaClass的定义即 JavaClass.java,但是找不到它的.class文件。
那java文件对应的class文件为什么不是在src包下的JavaDemo中,而是在bin包下的JavaDemo中?
右击项目mython->Properties->Java Build Path->source最下面有default output folder中默认的是mython\bin,且这个目录在 Package Explorer视图下是看不到的,在Navigator视图中可以看到。
4、将default output folder 修改为 mython\src,目录结构变化如下
mython
......
src
javaDemo
JavaClass.class
JavaClass.java
pythonDemo
Py2Ja.py
测试运行成功:
JavaClass Init
JavaClass IDE
JVM activity report :
classes loaded : 20
JVM has been shutdown
总结:对于新手不太习惯命令行式的Java程序调试,IDE虽然简单方便,但是都有自己默认的规则。这些规则新手可能注意不到,所以在IDE环境中照搬程序源码的时候,总会报一些奇奇怪怪的错误,使得本来简单的问题看上去很复杂。究其原因:1、对开发环境不熟悉、2、java基础不扎实。
特殊情况备注:
1、***.py文件运行时,默认路径即该文件的所在路径,导入***.class时的路径就变成了 ***.py所在的包 + from中的包,即默认.class文件是在 ***.py所在的包 的 子包中,所以在调用Java文件时,需要特别添加class文件所在路径。即使Java文件和Python文件在同一个包中,Java文件仍然在某个包中,测试运行时仍然要设置java文件所在的包最上级所在的目录,一般为 src。
2、将Java文件和Python文件都放在 src 下时,虽然目录结构中显示一个叫"(default package)",但是在Java文件的内部是没有包的设定的,这种情况下运行Python文件时,可不手工设置class文件所在路径,因为此时 Python文件的所在目录为src,而Java文件也在src中,且没有包名引起的问题。
刚刚接触 Python,因为基础不太扎实,期间诸多碰壁,仅此记录。
成长的道路上不怕跌倒,怕的是的跌倒了再也爬不起来。为自己加油!
Python+Jpype 调用 Java 碰壁全记录相关推荐
- Jython 调用 Java 碰壁全纪录
JavaClass 的定义 public class JavaClass { private String str = ""; public JavaClass() ...
- python jpype 调用java之坑
1.初始运行环境python 2.7 32位,jdk 1.8 32位,pycharm 32位 python使用jpype获取jvm位置信息,无法获取.之后使用jvm的绝对路径调用jvm,发现调用jvm ...
- Python利用JPype调用Java对象方法【实现在Python中调用JAVA】
一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...
- python利用jpype调用java对象方法
实现在python中调用JAVA 一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器 ...
- NWJS 调用java问题处理记录
NWJS 调用java问题处理记录 有关NWJS调用JAVA安装与发布运行时的问题: 1:确认nwjs使用的版本(x86或x86-64)与本机使用的node版本一致. 2:提示Error: Canno ...
- JPype:实现在python中调用JAVA 和 错误处理
JPype使用说明 1.安装jpype 安装的时候输入: pip install jpype1 (后面要加一个1) 2.启动JVM JPype 提供的 startJVM() 函数的作用是启动 JA ...
- 如何用pycharm调用Java_JPype实现在python中调用JAVA的实例
一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...
- jaydebeapi可以连接_Python安装jpype调用java,安装jaydebeapi通过jdbc连接数据库
1 importjpype,os,time,timer2 from jpype importjava3 from jpype importjavax4 5 HOST='192.168.48.103' ...
- python编写爬虫的步骤-零基础写python爬虫之爬虫编写全记录
先来说一下我们学校的网站: http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html 查询成绩需要登录,然后显示各学科成绩,但是只显示成绩而没有绩点,也就是 ...
最新文章
- 搞定vim的窗口操作
- Linux dmidecode备忘
- gbdt和xgboost中feature importance的获取
- linux中的进程、环境变量和虚拟地址
- 点赞!刘强东:无论京东员工遭遇何种不幸,将负责其子女费用到22岁
- 2012第51周星期二
- linux服务器邮局,linux系统下安装postfix邮局服务器
- visio业务流程图教学_visio业务流程图怎么画
- 跟父母还是要保持一定的距离感
- 如何删除部分页的页眉页脚
- 如何将计算机硬盘导出,移动硬盘坏了怎么导出数据?这几点一定要牢记!
- 政治正确的睡前故事(4则)【搬运】【破事水】
- 使用PHP获取网站Favicon的方法
- Linux开放80端口
- 联通的光纤--无线路由--mac过滤--存在问题
- 史上最全Maven教程(五)
- 拯救者R9000P AMD处理器 ubunu18.04 外接显示器失败 无法调节亮度 显卡无法驱动 好用
- 动态规划算法问题分析_背包问题_求相隔数据之间最大和_算法理解
- android ios打包工具下载,IOS移动开发之快速打包工具---- iTunes 降级 到12.6,回到你熟悉的版本...
- Centos镜像地址列表(全)