java调用jython报ImportError: No module named...错误解决方法

在Java调用Python开发环境配置(Eclipse+Jython+PyDev)中说明了如何通过java调用jython的代码,但是这有一个前提,就是jython中的代码没有import jython自己的包,如果在jython中引入了自己的包,比如加一句

import urllib

此时java在调用这个jython时就可能会报

import urllib
ImportError: No module named

这样的错误,虽然此时如果单独运行jython文件,不会报错,但是如果在java中调用的话就会报错。
这是因为单独运行jython和在java中调jython运行时的加载类的路径不一样,有兴趣的朋友可以在jython文件的顶部加上如下代码

#coding:utf-8
import sys
print(sys.path)

把jython运行时加载类库的路径打印出来看一下,就会发现通过java运行时,路径少了很多东西,所以就引入不到jython的类库了。因此解决办法就是在java中指定jython运行时需要加载类库的路径,通常是jython的安装目录,如果有自己写的jython文件,那也需要加上自己写的文件的路径。
java中代码如下。

Properties props = new Properties();
props.put("python.console.encoding", "UTF-8"); // Used to prevent: console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0.
props.put("python.security.respectJavaAccessibility", "false"); //don't respect java accessibility, so that we can access protected members on subclasses
props.put("python.import.site","false");
Properties preprops = System.getProperties();
PythonInterpreter.initialize(preprops, props, new String[0]);
PythonInterpreter interp = new PythonInterpreter();
interp.exec("import sys");
interp.exec("sys.path.append('D:/Program Files (x86)/jython2.7.0/Lib')");//jython自己的
interp.exec("sys.path.append('D:/Program Files (x86)/jython2.7.0/Lib/site-packages')");//jython自己的
interp.exec("sys.path.append('F:/workspace/wxserver/WebContent/py')");//我们自己写的

这样在java中调用jython就OK了!

你可能感兴趣的:(python)