当前位置: 首页 > 知识库问答 >
问题:

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

陈季
2023-03-14

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

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

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

共有3个答案

司马建柏
2023-03-14

我以前也遇到过同样的问题,也在这里阅读了答案,但没有发现任何令人满意的解决方案可以平衡兼容性、性能和良好的格式输出,Jython无法与extend C软件包一起工作,并且比CPython慢。所以最后我决定自己发明这个轮子,花了我5个晚上,我希望它也能帮助你:jpserve(https://github.com/johnhuang-cn/jpserve).

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

首先,在Python端启动jpservice

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

INFO:JPServe:JPServe starting...
INFO:JPServe:JPServe listening in localhost 8888

然后从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
唐康安
2023-03-14

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

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

您可以使用ScriptContext来配置将执行输出发送到哪里。

例如,假设在名为numbers的文件中有以下Python脚本。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脚本与Python2.5兼容,那么在Jython上运行它就不会有任何问题。

董光霁
2023-03-14

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

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/

 类似资料:
  • 我有一个Java程序来调用python脚本。我使用了exec方法。请在下面找到代码片段: Python程序(从维基百科收集一部分文本)单独运行时,可以提供适当的输出。当从Java调用时,我无法从python程序获得完整的输出。 我使用ready()方法检查了BufferedReader对象的状态(如本文所述,代码进入了无限循环)。 我认为其他人也面临着类似的问题-https://stackover

  • 问题内容: 我有一个脚本,执行时会向用户询问某些查询,并以json格式构建输出框架。使用python子进程,我可以从另一个名为的脚本中调用此脚本。一切都按预期工作,除了我无法在变量中获取输出?我正在Python 3中执行此操作。 问题答案: 要使用模块从另一个脚本中调用Python脚本并传递一些输入并获取其输出,请执行以下操作: 这里定义了功能。 更为灵活的替代方法是导入模块a并调用函数以获取结果

  • 我正在从我的Java代码中调用一个Python脚本。这是代码: python.py工作 python.py不起作用 所以,我正处于一个关键的阶段,我的启动有一个最后期限,我必须向客户展示我的MVP项目,我想像这样调用Python脚本。当我在没有dB连接和MySQLdb库的情况下打印任何东西时,它起作用。但是当我包含它们时,它并不运行python脚本。这里怎么了。不是应该运行处理所有输入的进程吗。我

  • 问题内容: 我正在尝试从python这样启动PowerShell脚本: 问题是我得到以下错误: 无法加载文件C:\ Users \ sztomi \ workspace \ myproject \ buildxml.ps1,因为在此系统上禁用了脚本的执行。请参阅“获取有关about_signing的帮助”以了解更多详细信息。 尽管事实上我很早以前确实通过键入管理员运行的PS终端来启用Powersh

  • 问题内容: 我有要从Python脚本调用的Perl脚本。我一直在寻找,并没有成功。我基本上是试图调用向Perl脚本发送1变量的方法,但是不需要Perl脚本的输出,因为它是一个自包含程序。 到目前为止,我想出的是: 只有刚刚开始的Python编程,所以我确定以上内容完全是胡说八道。任何帮助将非常感激。 问题答案: 如果您只想打开通往perl解释器的管道,那么您的方向正确。我认为您唯一缺少的是perl

  • 问题内容: 读取Java应用程序的输出(即通过System.out.println)的最好方法是用Python从Python调用 没有写和读文件?(无法使用Jython等解决方案) 问题答案: