在Jython中的reportlab“导入错误”

时间:2015-12-28 15:54:57

标签: java python jython-2.7

我正在使用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中的重写在预定的时间内是不可行的。

2 个答案:

答案 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()

将它们附加到您的程序中