从Java代码中调用Python脚本

本教程演示了从 Java 代码中调用 Python 脚本的三种不同方法。

从 Java 代码中调用 Python 脚本

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

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

我们可以使用 Java 的Process 类来从我们的 Java 代码中运行 Python 脚本。让我们试着创建一个Python脚本并使用Java代码运行它。按照下面的步骤进行:

  1. 在Java中的一个字符串中复制你的Python脚本。
  2. 使用BufferedWriter 创建一个扩展名为.py 的文件。
  3. 将上述字符串中的内容写入Python文件中,并关闭写入器。
  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 Delftstack.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 Delftstack.com!The Best Tutorial Site!

我们应该提到,不一定要创建一个Python的脚本,然后再运行它;你也可以直接在Java代码中加载你的Python脚本及其输出。

注意,你可能会得到一个关于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 Delftstack.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 Delftstack.com! The Best Tutorial Site!

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

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

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

  1. 从这里下载Jython Standalone
  2. Jython-standalone-2.7.2.jar 添加到你的构建path
  3. 转到项目Properties ->Java Build Path
  4. 添加外部Jar到你的classpath
  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阅读器。
setIn(java.io.InputStream) 用于为标准输入流设置一个 Java IO InputStream。
setOut(PyObject) 用于为标准输出流设置一个Python对象。
setOut(java.io.Writer) 用于为标准输出流设置一个Java IO写程序。
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 Delftstack.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 Delftstack.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 Delftstack.com! The Best Tutorial Site!, Message from Java
Hello, This is Delftstack.com! The Best Tutorial Site!, Message from Python
100
y: 70