Запуск Python с использованием Java - PullRequest
0 голосов
/ 13 сентября 2018

Как исправить приведенную ниже ошибку в Java?

Требование: запуск программы на Python с использованием Java

поддержка 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)

Совет, который является предпочтительным подходом для запуска программы на Python с помощью jython или путем вызова командного процесса, как вариант 2 в приведенном выше коде

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Поскольку проект jython неактивен, а не python 3, поэтому он не обновлен (см. Комментарии), вам подойдет вариант2 запустить python.exe как системный исполняемый файл.

Он не может работать так, как вы его закодировали, потому что 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();
    }
}
0 голосов
/ 19 сентября 2018

Похоже, что исключение, которое вы получаете, вызвано ошибкой jython (которая, по-видимому, исправлена ​​в jython-2.7.1).

По поводу вашего другого вопроса; если все, что вам нужно, это запустить скрипт и никоим образом не взаимодействовать с интерпретатором, и вы знаете, что в системе установлена ​​подходящая версия python, использование процесса, вероятно, будет намного проще, и вы избежите этого и потенциальных других проблем с Jython.

...