`
cdtdx
  • 浏览: 29342 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Jython 调用 Java 碰壁全纪录

 
阅读更多

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、进入 jython 目录,查看当前目录下只有一个JavaClass.java文件

D:\>cd jython
D:\jython>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、启动Jython 命令行模式(jython版本是 2.2.1)

D:\jython>jython

3、导入 JavaClass时,提示找不到JavaClass模块

>>> import JavaClass
Traceback (innermost last):
File "<console>", line 1, in ?
ImportError: no module named JavaClass

原因:Jython中导入的是.class文件,而JavaClass.java尚未编译生成 .class文件

4、Ctrl-Z退出 Jython, 编译 JavaClass.java

D:\jython>javac JavaClass.java
D:\jython>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步,再次进入Jython模式后导入 JavaClass时未报异常,说明成功导入,简单调用情况如下

D:\jython>jython
>>> import JavaClass
>>> jc = JavaClass()
>>> jc.str // 调用get方法
'JavaClass Init'
>>> jc.str = "JavaClass CMD" // 调用set方法
>>> jc.str

'JavaClass CMD'

二、eclipse IDE 环境

workplace 是d:\python,项目名称是mython,其结构如下

mython
......
bin
javaDemo
JavaClass.class
jythonDemo
Jy2Ja.py
lib
......
jython.jar
src
javaDemo
JavaClass.java
jythonDemo
Jy2Ja.py

1、JavaClass.java同上(但是第一行多了一个package javaDemo的定义)

2、编辑Jy2Ja.py如下:

from javaDemo import JavaClass
jc = JavaClass()
print jc.str
jc.str = "JavaClass IDE"
print jc.str

测试运行时报异常
Traceback (most recent call last):
File "D:\python\Mython\src\jythonDemo\Jy2Ja.py", line 4, in <module>
from javaDemo import JavaClass
ImportError: No module named javaDemo

原因:找不到javaDemo是因为“当前路径”下找不到JavaDemo文件或者目录

解决方法:可以在导入JavaClass之前导入sys.path,再 print sys.path 查看“当前路径”如下:
['D:\\python\\Mython\\src\\jythonDemo', 'C:\\Java\\jdk1.6.0_21\\jre\\lib\\resources.jar', 'C:\\Java\\jdk1.6.0_21\\jre\\lib\\rt.jar', ......, '__classpath__', '__pyclasspath__/']

手工添加 'D:\python\Mython\src\JavaDemo'到sys.path里,但是必须在导入JavaClass之前(Python是脚本语言,行解释的)

3、Jy2Ja.py修改后如下:

import sys.path as path
path.append("D:\python\Mython\src\javaDemo")
from javaDemo import JavaClass
jc = JavaClass()
print jc.str
jc.str = "JavaClass IDE"
print jc.str

测试运行时仍然报2中的异常,找不到JavaDemo

原因:手工添加的 'D:\python\Mython\src\JavaDemo'有问题。因为在eclipse IDE中,每个类都在一个包里,而包是当前路径的一部分,即JavaClass已经在包JavaDemo中

4、再次修改后如下:

import sys.path as path
path.append("D:\python\Mython\src")
from javaDemo import JavaClass
jc = JavaClass()
print jc.str
jc.str = "JavaClass IDE"
print jc.str

测试运行时仍然报异常
Traceback (most recent call last):
File "D:\python\Mython\src\jythonDemo\Jy2Ja.py", line 4, in <module>
from javaDemo import JavaClass
ImportError: cannot import name JavaClass
但是与2中的异常不一样:不能导入JavaClass。

原因:不能导入说明找到了,但是导入的时候出了问题。

在命令行中第3步中提到Jython文件导入的应该是.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视图中可以看到。

5、将default output folder 修改为 mython\src,目录结构变化如下

mython
......
lib
......
jython.jar
src
javaDemo
JavaClass.class
JavaClass.java
jythonDemo
Jy2Ja.py

测试运行成功:
JavaClass Init
JavaClassIDE

总结:对于新手不太习惯命令行式的Java程序调试,IDE虽然简单方便,但是都有自己默认的规则。这些规则新手可能注意不到,所以在IDE环境中照搬程序源码的时候,总会报一些奇奇怪怪的错误,使得本来简单的问题看上去很复杂。究其原因:1、对开发环境不熟悉、2、java基础不扎实。

特殊情况备注:

1、***.py文件运行时,默认路径即该文件的所在路径,导入***.class时的路径就变成了 ***.py所在的包 + from中的包,即默认.class文件是在 ***.py所在的包 的 子包中,所以在调用Java文件时,需要特别添加class文件所在路径。即使Java文件和Jython文件在同一个包中,Java文件仍然在某个包中,测试运行时仍然要设置java文件所在的包最上级所在的目录,一般为 src。

2、将Java文件和Jython文件都放在 src 下时,虽然目录结构中显示一个叫"(default package)",但是在Java文件的内部是没有包的设定的,这种情况下运行Jython文件时,可不手工设置class文件所在路径,因为此时 Jython文件的所在目录为src,而Java文件也在src中,且没有包名引起的问题。

3、其实只要Jython文件在 src 下,Java文件在哪里都可以

刚刚接触 Python,正在学习java开发,故从 Jython 入手。因为基础不太扎实,期间诸多碰壁,仅此记录。

成长的道路上不怕跌倒,怕的是的跌倒了再也爬不起来。为自己加油!

分享到:
评论

相关推荐

    java与Jython的相互调用

    ### Java与Jython的相互调用 #### 一、在Java中调用Jython 在Java中使用Jython主要依赖于`org.python.util.PythonInterpreter`这个类。该类提供了在Java环境中执行Python代码的能力。以下是一个简单的示例,演示了...

    Jython for Java Programmers.chm

    Jython for Java Programmers.chm Java程序员学习Jython的教程。

    java调用脚本语言笔记(jython,jruby,groovy)

    本文将深入探讨如何在Java中调用三种流行的脚本语言:Jython、JRuby和Groovy。 ### Jython Jython是Python的一个Java实现,它允许Java开发者利用Python的强大语法和丰富的库。要使用Jython,首先需要在项目中引入...

    New Riders - Jython for Java Programmers.rar_Riders_jython

    2. **Java平台集成**:Jython运行在Java虚拟机(JVM)上,可以直接调用Java类库,无缝集成Java应用。 3. **动态性**:与Java的静态类型系统不同,Jython是动态类型的,允许在运行时修改对象类型,提供了更大的灵活...

    Jython示例

    3. **丰富的Java库支持**:Jython可以直接调用Java的标准库和第三方库,极大地扩展了Python的功能。 4. **动态性**:Jython的动态性使得在运行时修改代码变得容易,适合快速迭代和调试。 **Jython示例** 在描述中...

    python调用java代码方法

    Python提供了多种方式来调用Java代码,其中最常见的是使用Jython(Python的Java实现)和Jython的Java Integration API,以及使用Java的JavaBridge或Jpype库。这里我们将主要关注Jpype,因为它是Python调用Java的高效...

    jython-standalone-2.7.0.jar

    《Java调用Python脚本:Jython详解及应用》 在现代软件开发中,常常需要在不同的编程语言之间进行交互,比如Java与Python。Jython是这样一种工具,它允许Java开发者无缝地运行Python代码,使得Java应用可以利用...

    java中jython操作把python数据类型转成java类型

    在Java中,Jython是一个非常有用的工具,它允许我们在Java应用程序中嵌入Python代码,并能够无缝地在Python数据类型和Java数据类型之间进行转换。这极大地扩展了Java的生态系统,让我们能够利用Python丰富的库和简洁...

    python调用java

    1. **Jython**: Jython是一种Python的实现,它直接运行在Java平台上,因此可以直接调用Java类库。只需将Python代码写成Jython,就可以无缝调用Java API。但是,Jython并不完全兼容标准CPython(Python的默认实现),...

    Java中调用Python代码

    通过Jython,Java可以像调用Java类一样调用Python模块。不过,Jython并不支持所有Python库,尤其是C扩展的库。 2. **JPyCall**: JPyCall是一个Java库,它提供了与Python互操作的能力,允许Java程序直接调用Python...

    python调用java.rar

    本主题聚焦于“Python调用Java”的技术,这允许我们利用Python的易用性和Java的高性能特性。我们将深入探讨如何实现这一目标,以及相关的知识点。 首先,Python和Java之间的互操作性主要依赖于`Jython`、`Jpype`和`...

    Scientific Data Analysis using Jython Scripting and Java

    - **无缝集成Java库**:由于Jython是在Java平台上运行的Python实现,因此可以直接调用Java类库,这对于科学计算和数据分析来说是非常有价值的。 - **性能优势**:虽然Python本身在执行速度上可能不如Java,但通过...

    Java调用python的方法(jython)

    Java调用Python的方法(Jython) Java调用Python的方法是使用Jython实现的,Jython是一门语言,它不是Java或Python的解释器,而是一种能够实现Java和Python代码互相访问的技术。 什么是Jython?Jython是一种语言,...

    Jython教程

    4. **集成Java库**:Jython可以直接导入Java类,这允许开发者使用Java的API,如Swing或JavaFX来创建图形用户界面,或者调用Java的网络、数据库等库。 5. **异常处理**:Jython的异常处理与Python一致,使用`try/...

    python调用java,开发jbpm6.0.0工作流Application

    Jython是一种Python解释器,它是用Java编写的,可以直接运行Java类库,使得Python代码可以无缝调用Java方法。而JyNI则是一个C++库,允许Python程序直接调用Java的本地接口(JNI)。在这个项目中,可能使用了Jython,...

    jython中文详细教程

    - Java集成:介绍如何在Jython中调用Java类库,实现Java与Python代码的混合编写。 - 应用实战:通过实例演示Jython在Web开发、数据处理等领域的应用。 **四、学习资源与实践** 1. **IBM Jython教程**:作为主要...

    jython简易教程

    Jython运行在Java虚拟机(JVM)上,使得Python程序可以直接调用Java类库,为混合编程提供了极大的便利。 **一、Jython简介** Jython由James Gosling的早期工作启发,最初在1997年由Jeffrey E.F. Friedl创建,后来由...

    Burpsuite环境Jython安装方法1

    它不是简单的 Java 翻译器或编译器,而是一个完整的 Python 解释器,实现了 Python 的语法和标准库,并且能够调用 Java 类库。这意味着 Jython 程序员不仅可以使用 Python 的丰富库,还可以利用 Java 平台的全部能力...

    jython-standalone-2.7.1.jar

    Jython的核心功能是它提供了一个Java接口,使得Python代码可以调用Java类库,反之亦然。这使得Python开发者能够利用Java的强大性能和丰富的库,同时保持Python的简洁性和易读性。在描述中提到,这个jar包就是为了...

    The Definitive Guide to Jython-Python for the Java Platform

    1. **无缝集成**:Jython 可以直接调用 Java 类库中的方法,这意味着开发者可以在 Python 脚本中使用 Java 的强大功能。 2. **灵活性**:由于 Jython 基于 Python,因此它继承了 Python 的灵活性,使得开发过程更加...

Global site tag (gtag.js) - Google Analytics