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

2022-08-31 14:54:33

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

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

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


答案 1

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

Process p = Runtime.getRuntime().exec("python yourapp.py");

您可以阅读如何实际读取此资源的输出:http://www.devdaily.com/java/edu/pj/pj010016 导入 java.io。*;

public class JavaRunCommand {

    public static void main(String args[]) {

        String s = null;

        try {
            
        // run the Unix "ps -ef" command
            // using the Runtime exec method:
            Process p = Runtime.getRuntime().exec("ps -ef");
            
            BufferedReader stdInput = new BufferedReader(new 
                 InputStreamReader(p.getInputStream()));

            BufferedReader stdError = new BufferedReader(new 
                 InputStreamReader(p.getErrorStream()));

            // read the output from the command
            System.out.println("Here is the standard output of the command:\n");
            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
            }
            
            // read any errors from the attempted command
            System.out.println("Here is the standard error of the command (if any):\n");
            while ((s = stdError.readLine()) != null) {
                System.out.println(s);
            }
            
            System.exit(0);
        }
        catch (IOException e) {
            System.out.println("exception happened - here's what I know: ");
            e.printStackTrace();
            System.exit(-1);
        }
    }
}

还有一个Apache库(Apache exec项目)可以帮助您做到这一点。您可以在此处阅读更多相关信息:

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

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


答案 2

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

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

可以使用 来配置要将执行输出发送到的位置。ScriptContext

例如,假设您在名为: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运行它。