【问题标题】:reportlab in Jython "import error"Jython 中的报告实验室“导入错误”
【发布时间】:2016-04-02 11:38:59
【问题描述】:

我正在使用 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 重写是不可行的。

【问题讨论】:

    标签: java python jython-2.7


    【解决方案1】:

    Jython 是与您系统的 Python 完全不同(且独立)的 Python 解释器。虽然 Python 标准库中的大多数库都存在于 Jython 中,但安装在系统 Python 中的第三方模块对于 Jython 版本根本不存在。

    Jython 足够兼容,您可以使用 Jython 解释器设置 Python virtualenv,并在该 virtualenv 中安装纯 Python 代码(即没有二进制模块)的模块 - 我认为 repotlab 不符合要求 - 但您可能尝试。在 Java 项目设置中,您的项目可能有自己的 Jython 解释器实例与其他 .jar 文件一起安装 - 它应该具有 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

    【讨论】:

    • 感谢您的回复。如果您知道更多我该怎么做,请告诉我;而且我也在考虑在Java内置的Android应用程序中做同样的事情,它会调用python脚本。如果我使用 python,我将能够更有效地使用我的资源。
    【解决方案2】:

    我在 stackExchange 链接上有一个解决方案 - Jython embedded in Java -- ImportError: No module named yaml 即我可以简单地在我的 Jython 安装目录下添加我需要的包,例如 jython/Lib/site-packages 我在 Python2 的 reportlab 上没有任何问题。 7.

    最重要的也是使用 sys.path.append() 将它们附加到您的程序中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 2011-10-05
      • 1970-01-01
      相关资源
      最近更新 更多