我正在使用jdk 1.8和Jython 2.7.0.jar来执行我的python代码。 但似乎Jython不支持Python的2.7功能'reportlab'模块。
我的Java代码:
package test;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class Test{
public Test()
{
System.out.println("Done!");
engine.eval("import sys");
engine.eval("print sys");
engine.eval("import reportlab");
engine.eval("print reportlab");
System.out.println("Done Here");
}
catch (ScriptException ex)
{
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
System.out.println(ex);
}
}
public static void main(String args[])
{
Test t=new Test();
}
}
我得到的错误:
run:
Done!
<module 'sys' (built-in)>
javax.script.ScriptException: ImportError: No module named reportlab in <script> at line number 1
Dec 28, 2015 8:57:52 PM test.Test <init>
SEVERE: null
javax.script.ScriptException: ImportError: No module named reportlab in <script> at line number 1
at org.python.jsr223.PyScriptEngine.scriptException(PyScriptEngine.java:202)
at org.python.jsr223.PyScriptEngine.eval(PyScriptEngine.java:42)
at org.python.jsr223.PyScriptEngine.eval(PyScriptEngine.java:31)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
at test.Test.<init>(Test.java:28)
at test.Test.main(Test.java:40)
Caused by: Traceback (most recent call last):
File "<script>", line 1, in <module>
ImportError: No module named reportlab
at org.python.core.Py.ImportError(Py.java:328)
at org.python.core.imp.import_first(imp.java:877)
at org.python.core.imp.import_module_level(imp.java:972)
at org.python.core.imp.importName(imp.java:1062)
at org.python.core.ImportFunction.__call__(__builtin__.java:1280)
at org.python.core.PyObject.__call__(PyObject.java:431)
at org.python.core.__builtin__.__import__(__builtin__.java:1232)
at org.python.core.imp.importOne(imp.java:1081)
at org.python.pycode._pyx2.f$0(<script>:1)
at org.python.pycode._pyx2.call_function(<script>)
at org.python.core.PyTableCode.call(PyTableCode.java:167)
at org.python.core.PyCode.call(PyCode.java:18)
at org.python.core.Py.runCode(Py.java:1386)
at org.python.core.__builtin__.eval(__builtin__.java:497)
at org.python.core.__builtin__.eval(__builtin__.java:501)
at org.python.util.PythonInterpreter.eval(PythonInterpreter.java:259)
at org.python.jsr223.PyScriptEngine.eval(PyScriptEngine.java:40)
... 4 more
建立成功(总时间:2秒)
如果有人可以建议我远程执行Python脚本的替代方法,我会感谢他们。
另外我在python中有一个很大的代码库,其中java中的重写在预定的时间内是不可行的。
答案 0 :(得分:3)
Jython是一个与系统Python完全不同(且独立)的Python解释器。虽然Python的标准库中的大多数库都将存在于Jython中,但系统Python中安装的第三方模块根本不存在于Jython版本中。
Jython足够兼容,你可以用Jython解释器设置一个Python virtualenv,并在virtualenv中安装纯python代码(即没有二进制模块)的模块 - 我不认为repotlab是这样的 - 但你可能尝试。在Java项目设置中,您的项目可能在其他.jar文件中安装了自己的Jython解释器实例 - 它应该在某个地方有一个site-packages
文件夹,您可以尝试将纯Python第三方模块复制到,但是再一次,我认为reportlab不会兼容jython。
一个选项是在外部进程中使用Python本身(cPython),并使用xmlrpc代码从Java(或Jython)调用它 - (快速谷歌搜索没有找到通过xmlrpc调用cPython的方法来自纯Java - 但我知道它可以在Jython中运行,如果你使用Python的stdlib xmlrpc记录 - https://docs.python.org/3/library/xmlrpc.html?highlight=xmlrpc
答案 1 :(得分:0)
我在stackExchange链接上有一个解决方案 - Jython embedded in Java -- ImportError: No module named yaml即我可以在我的Jython安装目录下添加我需要的软件包例如jython / lib / site-packages我在reportlab上没有任何问题Python2.7。
最重要的是还使用sys.path.append()
将它们附加到您的程序中