Вызов и получение вывода из скрипта Python на Java?
каков самый простой способ выполнить скрипт Python из Java и получить вывод этого скрипта? Я искал разные библиотеки, такие как Jepp или Jython, но большинство из них устарели. Другая проблема с библиотеками заключается в том, что мне нужно иметь возможность легко включить библиотеку с исходным кодом (хотя мне не нужно источник для самой библиотеки), если я использую библиотеку.
из-за этого самый простой / самый эффективный способ-просто сделать что-то вроде вызова скрипт со средой выполнения.exec, а затем как-то захватить печатный вывод? Или, хотя это было бы очень болезненно для меня, я также мог бы просто вывести скрипт Python во временный текстовый файл, а затем прочитать файл на Java.
Примечание: фактическая связь между Java и Python не является требованием проблемы, которую я пытаюсь решить. Это, однако, единственный способ, который я могу придумать, чтобы легко выполнить то, что нужно сделать.
8 ответов
не уверен, правильно ли я понимаю ваш вопрос, но при условии, что вы можете вызвать исполняемый файл Python из консоли и просто хотите захватить его вывод на Java, вы можете использовать exec()
метод в Java Runtime
класса.
Process p = Runtime.getRuntime().exec("python yourapp.py");
вы можете прочитать о том, как на самом деле читать выход здесь:
http://www.devdaily.com/java/edu/pj/pj010016
существует также библиотека Apache (проект Apache exec), которая может помочь вам с этот. Подробнее об этом можно прочитать здесь:
http://www.devdaily.com/java/java-exec-processbuilder-process-1
вы можете включить языка Jython библиотека в вашем проекте Java. Ты можешь!--8-->скачать исходный код из самого проекта Jython.
Jython делает предлагает поддержку для JSR-223 который в основном позволяет запускать скрипт Python С Java.
можно использовать ScriptContext
чтобы настроить, куда вы хотите отправить вывод выполнения.
например, предположим, что у вас есть следующий скрипт Python в файле имени numbers.py
:
for i in range(1,10):
print(i)
Итак, вы можете запустить его с Java следующим образом:
public static void main(String[] args) throws ScriptException, IOException {
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");
engine.eval(new FileReader("numbers.py"), context);
System.out.println(writer.toString());
}
и выход будет:
1
2
3
4
5
6
7
8
9
пока ваш скрипт Python совместим с Python 2.5, у вас не будет проблем с запуском этого с Jython.
я столкнулся с той же проблемой раньше, также прочитал ответы здесь, но не нашел никакого решения, которое могло бы сбалансировать совместимость, производительность и форматирование, Jython не может работать с пакетами extend C и медленнее, чем CPython. Поэтому, наконец, я решил изобрести колесо сам, это заняло мои 5 ночей, я надеюсь, что это может помочь вам тоже: jpserve (https://github.com/johnhuang-cn/jpserve).
JPserve предоставляет простой способ вызвать Python и обменять результат на ну формат JSON, немного потери производительности. Ниже приведен пример кода.
сначала запустите jpserve на стороне Python
>>> from jpserve.jpserve import JPServe
>>> serve = JPServe(("localhost", 8888))
>>> serve.start()
INFO:JPServe:JPServe starting...
INFO:JPServe:JPServe listening in localhost 8888
затем вызовите Python со стороны JAVA:
PyServeContext.init("localhost", 8888);
PyExecutor executor = PyServeContext.getExecutor();
script = "a = 2\n"
+ "b = 3\n"
+ "_result_ = a * b";
PyResult rs = executor.exec(script);
System.out.println("Result: " + rs.getResult());
---
Result: 6
Я искал разные библиотеки, такие как Jepp или Jython, но большинство из них, похоже, очень устарели.
Jython не является "библиотекой"; это реализация языка Python поверх виртуальной машины Java. Он определенно не устарел; самым последним релизом был февраль. 24 этого года. Он реализует Python 2.5, что означает, что вам будет не хватать нескольких более поздних функций, но он, честно говоря, не сильно отличается от 2.7.
Примечание: фактическая связь между Java и Python не является требованием вышеупомянутого задания, поэтому это не делает мою домашнюю работу для меня. Это, однако, единственный способ, который я могу придумать, чтобы легко выполнить то, что нужно сделать.
Это кажется очень маловероятно для школьного задания. Пожалуйста, расскажите нам больше о том, что вы действительно пытаюсь сделать. Обычно в школьных заданиях указывается, какие именно языки вы будете использовать для чего, и я никогда не слышал о том, что включало более одного языка вообще. Если бы это было так, они бы сказали вам, если вам нужно установить такой вид связи, и как они намеревались это сделать.
подход языка Jython
Java должна быть независимой от платформы, и вызов собственного приложения (например, python) не очень независим от платформы.
существует версия Python (Jython), написанная на Java, которая позволяет нам вставлять Python в наши Java-программы. Как обычно, когда вы собираетесь использовать внешние библиотеки, одним из препятствий является компиляция и корректное ее выполнение, поэтому мы проходим процесс создания и запуска простой Java-программа с Jython.
мы начнем с получения файла Jython jar:
http://www.jython.org/downloads.html
Я скопировал jython-2.5.3.jar в каталог, где будет моя Java-программа. Затем я набрал следующую программу, которая делает то же самое, что и предыдущие два; возьмите два числа, отправьте их на python, который добавляет их, затем python возвращает его обратно в нашу Java-программу, где число выводится на экран:
import org.python.util.PythonInterpreter;
import org.python.core.*;
class test3{
public static void main(String a[]){
PythonInterpreter python = new PythonInterpreter();
int number1 = 10;
int number2 = 32;
python.set("number1", new PyInteger(number1));
python.set("number2", new PyInteger(number2));
python.exec("number3 = number1+number2");
PyObject number3 = python.get("number3");
System.out.println("val : "+number3.toString());
}
}
Я называю этот файл " test3.java", сохраните его и выполните следующие действия для его компиляции:
javac-classpath jython-2.5.3.jar test3.java
следующий шаг-попытаться запустить его, что я и делаю следующим образом:
java-classpath jython-2.5.3.сосуд.: test3
теперь это позволяет нам использовать Python из Java независимо от платформы. Это довольно медленно. Тем не менее, это круто, что это интерпретатор Python, написанный в Ява...
Jep является вариантом anther. Он встраивает CPython в Java через JNI.
import jep.Jep;
//...
try(Jep jep = new Jep(false)) {
jep.eval("s = 'hello world'");
jep.eval("print(s)");
jep.eval("a = 1 + 2");
Long a = (Long) jep.getValue("a");
}
вы можете попробовать использовать groovy. Он работает на JVM, и он поставляется с большой поддержкой для запуска внешних процессов и извлечения вывода:
http://groovy.codehaus.org/Executing + внешние + процессы+от + Groovy
вы можете увидеть в этом коде, взятом из той же ссылки, как groovy позволяет легко получить статус процесса:
println "return code: ${ proc.exitValue()}"
println "stderr: ${proc.err.text}"
println "stdout: ${proc.in.text}" // *out* from the external program is *in* for groovy
сначала я бы рекомендовал использовать ProcessBuilder (начиная с 1.5 )
Простое использование описано здесь
https://stackoverflow.com/a/14483787
Для более сложного примера см.
http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html
Я столкнулся с проблемой при запуске скрипта Python из Java, script производил слишком много продукции, чтобы стандартизировать, и все пошло плохо.