2015-12-28 50 views
3

我使用jdk 1.8和Jython 2.7.0.jar來執行我的python代碼。 但似乎Jython不支持Python的2.7功能'reportlab'模塊。Jython中的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 

BUILD SUCCESSFUL(總時間:2秒)

如果還有人建議我遠程執行的另一種方式一個Python腳本,我會感謝他們。

此外,我有一個python的大型代碼庫,其中重寫在java中是不可行的在計劃時間。

回答

3

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)調用它 - (一個快速的谷歌搜索沒有找到一種方法來通過調用cPython從純Java XML-RPC - 但我知道它從Jython的工作,如果你使用Python STDLIB XML-RPC作爲記錄 - https://docs.python.org/3/library/xmlrpc.html?highlight=xmlrpc

+0

感謝您的回覆。如果你知道更多我能做到這一點,請告訴我;我也在考慮在用Java構建的Android應用程序中做同樣的事情,這會調用python腳本。如果我使用Python,我將能夠更有效地使用我的資源。 – Newbee