在Java中调用和接收Python脚本的输出?

404*_*und 48 python java

从Java执行Python脚本并接收该脚本的输出的最简单方法是什么?我已经找到了像Jepp或Jython这样的不同的库,但大多数都看起来过时了.库的另一个问题是,如果我使用库,我需要能够轻松地包含带有源代码的库(尽管我不需要为库本身提供源代码).

因此,最简单/最有效的方法是简单地做一些事情,比如用runtime.exec调用脚本,然后以某种方式捕获打印输出?或者,即使这对我来说非常痛苦,我也可以将Python脚本输出到临时文本文件,然后用Java读取文件.

注意:Java和Python之间的实际通信并不是我试图解决的问题的要求.然而,这是我能想到的唯一方法,可以轻松地执行需要完成的任务.

Sev*_*vas 56

不确定我是否正确理解了您的问题,但如果您可以从控制台调用Python可执行文件并且只想在Java中捕获其输出,则可以使用exec()Java Runtime类中的方法.

Process p = Runtime.getRuntime().exec("python yourapp.py");
Run Code Online (Sandbox Code Playgroud)

您可以在这里阅读如何实际读取输出:

http://www.devdaily.com/java/edu/pj/pj010016

还有一个Apache库(Apache exec项目)可以帮助您解决这个问题.你可以在这里读更多关于它的内容:

http://www.devdaily.com/java/java-exec-processbuilder-process-1

http://commons.apache.org/exec/

  • 运行`Runtime.getRuntime().exec("python yourapp.py");`抛出一个异常:`java.io.IOException:无法运行程序"python":CreateProcess error = 2,系统找不到指定的文件`请注意python是我的PATH变量的一部分 (2认同)

Edw*_*rzo 30

您可以在Java项目中包含Jython库.您可以从Jython项目本身下载源代码.

Jython确实提供了对JSR-223的支持,它基本上允许您从Java运行Python脚本.

您可以使用a ScriptContext配置要将执行输出发送到的位置.

例如,假设您在名为的文件中包含以下Python脚本numbers.py:

for i in range(1,10):
    print(i)
Run Code Online (Sandbox Code Playgroud)

因此,您可以从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()); 
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

1
2
3
4
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)

只要您的Python脚本与Python 2.5兼容,使用Jython运行此脚本就不会有任何问题.

  • ScriptEngine需要在类路径上使用jython,否则'engine'为null (2认同)
  • Jython是JVM的python实现,[它不支持C扩展](http://www.jython.org/docs/tutorial/indexprogress.html),例如numpy。 (2认同)

Joh*_*ang 8

我遇到过同样的问题,也看到这里的答案,但并没有发现任何满足解决方案能够平衡兼容性,性能和良好的格式输出,Jython的不能延长C型包件和慢于CPython的工作.所以最后我决定发明轮子自己,花了我5个晚上,我希望它也可以帮助你:jpserve(https://github.com/johnhuang-cn/jpserve).

JPserve提供了一种调用Python并通过格式良好的JSON交换结果的简单方法,几乎​​没有性能损失.以下是示例代码.

首先,在Python端启动jpserve

>>> from jpserve.jpserve import JPServe
>>> serve = JPServe(("localhost", 8888))
>>> serve.start()

INFO:JPServe:JPServe starting...
INFO:JPServe:JPServe listening in localhost 8888
Run Code Online (Sandbox Code Playgroud)

然后从JAVA端调用Python:

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
Run Code Online (Sandbox Code Playgroud)


Ari*_*iel 5

Jep是另一个选择。它通过 JNI 将CPython嵌入到 Java 中。

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");
    }
Run Code Online (Sandbox Code Playgroud)