Py学习  »  Python

使用Java运行Python

johnsi george • 4 年前 • 296 次点击  

如何在Java中修复下面的错误?

要求:使用Java运行Python程序

支持lib:jython-standalone-2.7.0.jar

安装的python:python 3.6.0

public static void main(String[] args) throws FileNotFoundException, ScriptException, IOException {
    System.out.println("Hello world!!");
    //option 1
    StringWriter writer = new StringWriter(); //ouput will be stored here

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptContext context = new SimpleScriptContext();

    context.setWriter(writer); //configures output redirection

    ScriptEngine engine = manager.getEngineByName("python");
    PythonInterpreter interpreter = new PythonInterpreter();

    interpreter.exec("import sys\nsys.path.append('C:\\Users\\johns\\AppData\\Local\\Programs\\python\\python36\\Lib\\site-packages')");
    engine.eval(new FileReader("C:\\Users\\johns\\Desktop\\python\\pytest.py"), context);
    System.out.println("");
    System.out.println(writer.toString());
//option 2
   // String execCmd = execCmd("python 
C:\\Users\\johns\\Desktop\\python\\pytest.py");
   // System.out.println("From Cmd Prompt" + execCmd);

}

public static String execCmd(String cmd) throws java.io.IOException {
    Process proc = Runtime.getRuntime().exec(cmd);
    java.io.InputStream is = proc.getInputStream();
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
    String val = "";
    if (s.hasNext()) {
        val = s.next();
    } else {
        val = "";
    }
    return val;
}

错误消息:

Exception in thread "main" javax.script.ScriptException: AttributeError: 'tuple' object has no attribute 'major' 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:47)
at pythonproj.PythonProj.main(PythonProj.java:47)
Caused by: Traceback (most recent call last):
File "<script>", line 1, in <module>
File "C:\Users\johns\AppData\Local\Programs\python\python36\Lib\site- 
packages\pytesseract\__init__.py", line 1, in <module>
from .pytesseract import (
File "C:\Users\johns\AppData\Local\Programs\python\python36\Lib\site- 
packages\pytesseract\pytesseract.py", line 10, in <module>
from PIL import Image
File "C:\Users\johns\AppData\Local\Programs\python\python36\Lib\site- 
packages\PIL\Image.py", line 31, in <module>
from ._util import py3
File "C:\Users\johns\AppData\Local\Programs\python\python36\Lib\site- 
packages\PIL\_util.py", line 3, in <module>
py3 = sys.version_info.major >= 3
AttributeError: 'tuple' object has no attribute 'major'

at org.python.core.Py.AttributeError(Py.java:205)
at org.python.core.PyObject.noAttributeError(PyObject.java:1013)
at org.python.core.PyObject.__getattr__(PyObject.java:1008)

建议:使用jython运行python程序或调用上面代码中的命令进程作为选项2是更好的方法

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38072
 
296 次点击  
文章 [ 2 ]  |  最新文章 4 年前
pdem
Reply   •   1 楼
pdem    5 年前

由于Jython项目是非活动的,而不是python 3,所以不是最新的(请参见注释),所以作为系统可执行文件启动python.exe的选项2是好的。

因为runtime.exec不执行dos cli,而是直接执行一个可执行文件,所以它无法按照您对其进行编码的方式工作。所以您启动的是python.exe,而py文件就是这个命令的一个参数

下面是启动它的方法

public static String execPython(String pythonFile) throws java.io.IOException {

    // modification here: provide a String array with "python" as first argument, 
    // you may add other argument of your python program

    Process proc = Runtime.getRuntime().exec(new String[] {"python",pythonFile});

    java.io.InputStream is = proc.getInputStream();
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
    String val = "";
    if (s.hasNext()) {
        val = s.next();
    } else {
        val = "";
    }
    return val;
}

public static void main(String[] args) {
    try {
        String stdStream = execPython("C:\\Users\\johns\\Desktop\\python\\pytest.py");
        System.out.println(stdStream);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
OhleC
Reply   •   2 楼
OhleC    5 年前

你得到的例外似乎是由 a jython bug (显然是用Jython-2.7.1固定的)。

关于您的另一个问题;如果您只想运行脚本,而不想以任何方式与解释器交互,并且您知道系统上安装了合适的Python版本,那么使用一个过程可能会容易得多,并且避免这一点以及Jython可能出现的其他问题。