迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

如何在 Java 代码中调用 Python 脚本

作者:迹忆客 最近更新:2023/08/07 浏览次数:

本文介绍了从 Java 代码调用 Python 脚本的三种不同方法。


从 Java 代码调用 Python 脚本

有时,我们必须从Java代码中调用Python脚本来满足项目需求。 我们可以使用 Process、ProcessBuilder 和 Jython 来做到这一点。 下面让我们看看如何使用它们。

使用 Process 类从 Java 代码运行 Python 脚本

我们可以使用 Java 的 Process 类从 Java 代码运行 Python 脚本。 让我们尝试创建一个 Python 脚本并使用 Java 代码运行它。 请按照以下步骤操作:

  1. 将 Python 脚本复制到 Java 中的字符串中。
  2. 使用 BufferedWriter 创建扩展名为 .py 的文件。
  3. 将上述字符串的内容写入 Python 文件并关闭 writer。
  4. 使用 Runtime.getRuntime().exec() 创建一个进程来运行 Python 文件。
  5. 使用 BufferedReader 从进程中读取数据。
  6. 使用或打印通过运行 Python 代码检索到的数据。

现在我们用Java代码来实现上述步骤:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStreamReader;

public class Example {
    public static void main(String a[]){
        try{
            String Python_Script = 
                "print(\"Hello, This is Jiyik.com!The Best Tutorial Site!\")\n";

            BufferedWriter Buffered_Writer = new BufferedWriter(
                                             new FileWriter("DemoPythonFile.py"));
            Buffered_Writer.write(Python_Script);
            Buffered_Writer.close();

            Process Demo_Process = Runtime.getRuntime().exec("python DemoPythonFile.py");

            BufferedReader Buffered_Reader = new BufferedReader(
                                             new InputStreamReader(
                                                 Demo_Process.getInputStream()
                                             ));
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

上面的代码尝试在 Java 中创建并运行 Python 脚本,并在 DemoPythonFile.py 文件中写入以下字符串。

Hello, This is Jiyik.com!The Best Tutorial Site!

值得一提的是,没有必要创建Python脚本然后运行它; 您还可以直接加载 Python 脚本及其 Java 代码输出。

请注意,您可能会收到有关 Runtime.getRuntime().exec() 函数弃用的警告,这意味着 Java 可能会在未来版本中删除此函数。

使用 ProcessBuilder 类从 Java 代码运行 Python 脚本

Java中的ProcessBuilder类用于创建操作系统进程。 我们还可以使用这个类在Java中运行Python脚本。

按照以下步骤使用 ProcessBuilder 类在 Java 中运行 Python 脚本:

  1. 确保您的系统上安装了 Python。
  2. 创建一个扩展名为 .py 的 Python 脚本,或者如果您已有脚本,请选择一个。
  3. 创建 ProcessBuilder 类的实例并将 python 和脚本路径作为参数传递。
  4. 使用start()方法创建一个进程来运行ProcessBuilder; 这将执行 Python 脚本。
  5. 创建 BufferedReader 以从进程获取 Python 脚本的输出。
  6. 打印输出。

让我们用 Java 来实现这个例子。 我们的 Python 脚本是:

print("Hello, This is Jiyik.com! The Best Tutorial Site!") 

下面是Java的实现:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Example {
    public static void main(String[] args) throws IOException, InterruptedException {
        String Script_Path = "C:\\Users\\Sheeraz\\script.py";
        ProcessBuilder Process_Builder = new
                                         ProcessBuilder("python",Script_Path)
                                         .inheritIO();

        Process Demo_Process = Process_Builder.start();
        Demo_Process.waitFor();

        BufferedReader Buffered_Reader = new BufferedReader(
                                         new InputStreamReader(
                                         Demo_Process.getInputStream()
                                         ));
        String Output_line = "";

        while ((Output_line = Buffered_Reader.readLine()) != null) {
            System.out.println(Output_line);
        }
    }
}

上面的代码将使用 Java 执行给定的 Python 脚本并将其打印在控制台上。 查看输出:

Hello, This is Jiyik.com! The Best Tutorial Site!

使用 Jython 一起运行 Python 和 Java 代码

Jython 是一个以 Java 代码提供 Python 脚本实现的项目。 Jython 相互运行 Python 和 Java 代码。

要在 Java 中使用 Jython,我们只需下载 Jython-standalone-2.7.2.jar 或任何最新版本并将其添加到项目的构建路径中。 请按照以下步骤将 Jython 添加到您的 Java 环境:

  1. 从此处下载 Jython 独立版。
  2. 将 Jython-standalone-2.7.2.jar 添加到您的构建路径。
  3. 转到项目属性 -> Java 构建路径。
  4. 将外部 Jar 添加到您的类路径中。
  5. 选择 Jython-standalone-2.7.2.jar 并单击应用并关闭。

一旦 Jython 包含在我们的 Java 环境中,我们现在就可以在 Java 中运行 Python 脚本。 PythonInterpreter 类来自 Jython,用于执行 Python 脚本和操作。

以下是 Jython 在 Java 中运行 Python 的不同方法:

方法 说明
setIn(PyObject) 用于设置标准输入流的 Python 对象。
setIn(java.io.Reader) 用于为标准输入流设置 Java IO Reader。
setIn(java.io.InputStream) 用于设置标准输入流的Java IO InputStream。
setOut(PyObject) 用于设置标准输出流的Python对象。
setOut(java.io.Writer) 用于设置标准输出流的 Java IO writer。
setOut(java,io.OutputStream) 用于设置标准输出流的Java IO OutputStream。
setErr(java.io.Writer) 用于设置标准错误流的 Java IO 编写器。
setErr(PyObject) 用于设置标准错误流的 Python 对象。
setErr(java.io.OutputStream) 用于设置标准错误流的 Java IO OutputStream。
eval(String) 用于评估 Java 的 Python 字符串。
eval(PyObject) 用于评估 Java 的 Python 对象。
exec(String) 用于在本地命名空间中执行Python字符串。
exec(PyObject) 用于执行本地命名空间中的Python对象。
execfile(String filename) 用于执行本地命名空间中的Python文件。
execfile(java.io.InputStream) 用于在本地命名空间中执行Python InputStream。
compile(String) 用于将 Python 字符串编译为表达式模块。
compile(script, filename) 用于将 Python 脚本编译为表达式模块。
set(String name, Object value) 用于设置对象类型的变量。
set(String name, PyObject value) 用于设置 PyObject 类型的变量。
get(String) 用于获取变量的值。
get(String name, Classjavaclass) 用于获取变量的值并将其作为给定 Java 类的实例返回。

现在,我们了解了 Jython 项目中的方法。 让我们尝试在我们的示例中使用其中的一些: script.py 文件:

print("Hello, This is Jiyik.com! The Best Tutorial Site!, Message from Python") 

Jython的实现:

import org.python.util.PythonInterpreter;
import org.python.core.*;

public class Example {
   public static void main(String []args) throws PyException {
      PythonInterpreter Python_Interpreter = new PythonInterpreter();
      System.out.println(
          "Hello, This is Jiyik.com! The Best Tutorial Site!, Message from Java"
      );

      // Run a Python file
      Python_Interpreter.execfile("C:\\Users\\Sheeraz\\script.py");

      //  Run Different Python operations
      // Set a variable and print it using Python in java
      Python_Interpreter.set("x", new PyInteger(100));
      Python_Interpreter.exec("print x");

      // Execute a sum
      Python_Interpreter.exec("y = 25+45");
      PyObject y = Python_Interpreter.get("y");
      System.out.println("y: "+y);
   }
}

上面的代码将从文件执行 Python 脚本,并使用上表中的方法运行一些 Python 操作。 查看输出:

Hello, This is Jiyik.com! The Best Tutorial Site!, Message from Java
Hello, This is Jiyik.com! The Best Tutorial Site!, Message from Python
100
y: 70

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 Java 中延迟几秒钟的时间

发布时间:2023/12/17 浏览次数:217 分类:Java

本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。

如何在 Java 中把 Hashmap 转换为 JSON 对象

发布时间:2023/12/17 浏览次数:187 分类:Java

它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。

如何在 Java 中按值排序 Map

发布时间:2023/12/17 浏览次数:171 分类:Java

本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map 进行排序,并列出了一些示例代码来理解它。

如何在 Java 中打印 HashMap

发布时间:2023/12/17 浏览次数:192 分类:Java

本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。

在 Java 中更新 Hashmap 的值

发布时间:2023/12/17 浏览次数:146 分类:Java

本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。

Java 中的 hashmap 和 map 之间的区别

发布时间:2023/12/17 浏览次数:79 分类:Java

本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,

在 Java 中获取用户主目录

发布时间:2023/12/17 浏览次数:218 分类:Java

这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。

Java 中 size 和 length 的区别

发布时间:2023/12/17 浏览次数:179 分类:Java

这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。

Java 中的互斥锁

发布时间:2023/12/17 浏览次数:111 分类:Java

了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便