无法从Jython模块导入Java类
注:我找到了解决方案并自己回答。虽然,我不知道为什么这种设置是错误的并导致了问题。我仍然对Jython导入系统的工作原理有很好的解释。如果有人关心获得赏金,请回答。无法从Jython模块导入Java类
我正在研究现有的Java EE项目,我需要在Python中进行计算。我处于集成测试的第一阶段,但我已经面临一个问题。我读Chapter 10 of Jython book但仍然找不到解决方案。我也读Chapter 8(代码重用的模块和包),但对我来说目前还不清楚。
Jython导入系统如何工作以及如何配置它的说明将非常感谢。
问题:
$ jython -v
import: 'exceptions' as org.python.core.exceptions in builtin modules
Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:54:35)
[Java HotSpot(TM) Server VM (Oracle Corporation)] on java1.7.0_10
import: import site # precompiled from /home/me/jython/2.5.3/Lib/site$py.class
import: 'sys' as sys in builtin modules
import: import os # precompiled from /home/me/jython/2.5.3/Lib/os$py.class
import: 'errno' as org.python.modules.errno in builtin modules
import: 'posix' as org.python.modules.posix.PosixModule in builtin modules
import: import posixpath # precompiled from /home/me/jython/2.5.3/Lib/posixpath$py.class
import: import stat # precompiled from /home/me/jython/2.5.3/Lib/stat$py.class
import: 'java' as java package
import: 'File' as java class
import: 'IOException' as java class
import: 'org' as java package
import: 'Py' as java class
Type "help", "copyright", "credits" or "license" for more information.
>>> import pendulum.generator.BuildingType
import: import pendulum # precompiled from /path/to/project/build/classes/pendulum/__init__$py.class
import: import pendulum.generator # precompiled from /path/to/project/build/classes/pendulum/generator/__init__$py.class
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named BuildingType
我的问题是:什么我做错了,我怎么解决的事情,成功导入BuildingType接口?也许问题在于CLASSPATH,但我不知道哪个值可能适合。
代码组织:由private Jython registry file定义
$ tree build/classes/pendulum/generator/ src/pendulum/generator/
build/classes/pendulum/generator/
├── BuildingType.class
├── __init__.py
└── __init__$py.class
src/pendulum/generator/
├── BuildingType.java
└── __init__.py
导入路径:
$ cat ~/.jython
python.path=\
/path/to/project/build/classes:\
/path/to/project/src:\
/home/me/jdevel/extras/2.5.3/Lib:\
/home/me/jdevel/extras/2.5.3/Lib/site-packages
我敢肯定的Jython拿起路径,因为我检查与sys.path
在Jython提示符下。
BuildingType.java
package pendulum.generator;
public interface BuildingType {
public String getBuildingName();
public String getBuildingAddress();
public String getBuildingId();
}
在try/catch方法浪费了很多时间之后,我能够自己找到答案。
.jython 有看起来像这样:
python.path=\
/path/to/project/build:\
/path/to/project/src:\
/home/me/jdevel/extras/2.5.3/Lib:\
/home/me/jdevel/extras/2.5.3/Lib/site-packages
不是这个:
python.path=\
/path/to/project/build/classes:\
/path/to/project/src:\
/home/me/jdevel/extras/2.5.3/Lib:\
/home/me/jdevel/extras/2.5.3/Lib/site-packages
尤其加入/path/to/project/build/classes
的导入路径是错误(即使它反映了文件系统层次结构),而/path/to/project/build
是正确的,并解决了这个问题。
您需要设置CLASSPATH以及python.path。
在相同的目录布局,这个工作对我来说:
jython10$ CLASSPATH=build/classes/ jython -v Building.py
import: 'exceptions' as org.python.core.exceptions in builtin modules
import: import site # precompiled from /usr/local/Java/jython2.5.3/Lib/site$py.class
import: 'sys' as sys in builtin modules
import: import os # precompiled from /usr/local/Java/jython2.5.3/Lib/os$py.class
import: 'errno' as org.python.modules.errno in builtin modules
import: 'posix' as org.python.modules.posix.PosixModule in builtin modules
import: import posixpath # precompiled from /usr/local/Java/jython2.5.3/Lib/posixpath$py.class
import: import stat # precompiled from /usr/local/Java/jython2.5.3/Lib/stat$py.class
import: java package as '/Users/sdm7g/jaxp/jython10/build/classes/pendulum'
import: 'pendulum' as java package
import: 'pendulum' as java package
import: java package as '/Users/sdm7g/jaxp/jython10/build/classes/pendulum/generator'
import: 'pendulum.generator' as java package
import: 'BuildingType' as java class
参考:Working with CLASSPATH(Jython的书)。
非常感谢。没有设置classpath,我无法从命令行使用我的类('java.lang.ClassNotFoundException')。尽管如此,从Eclipse内部一切正常。 – Paolo 2013-02-22 21:13:15
尝试“从钟摆。生成器导入BuildingType“ – sarwar 2013-02-14 16:43:22
ImportError:无法导入名称BuildingType – Paolo 2013-02-14 16:45:22
jython.jar是否在jre/lib/ext? – 2013-02-15 17:41:31