从 Java 代码调用 Python 脚本
本篇文章介绍了从 Java 代码调用 Python 脚本的三种不同方法。
从 Java 代码调用 Python 脚本
有时,我们必须从Java代码中调用Python脚本来满足项目需求。 我们可以使用 Process、ProcessBuilder 和 Jython 来做到这一点。 下面让我们看看如何使用它们。
使用 Process 类从 Java 代码运行 Python 脚本
我们可以使用 Java 的 Process 类从 Java 代码运行 Python 脚本。 让我们尝试创建一个 Python 脚本并使用 Java 代码运行它。 请按照以下步骤操作:
- 将 Python 脚本复制到 Java 中的字符串中。
- 使用 BufferedWriter 创建扩展名为 .py 的文件。
- 将上述字符串的内容写入 Python 文件并关闭 writer。
-
使用
Runtime.getRuntime().exec()
创建一个进程来运行 Python 文件。 - 使用 BufferedReader 从进程中读取数据。
- 使用或打印通过运行 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 脚本:
- 确保您的系统上安装了 Python。
- 创建一个扩展名为 .py 的 Python 脚本,或者如果您已有脚本,请选择一个。
- 创建 ProcessBuilder 类的实例并将 python 和脚本路径作为参数传递。
- 使用start()方法创建一个进程来运行ProcessBuilder; 这将执行 Python 脚本。
- 创建 BufferedReader 以从进程获取 Python 脚本的输出。
- 打印输出。
让我们用 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 环境:
- 从此处下载 Jython 独立版。
- 将 Jython-standalone-2.7.2.jar 添加到您的构建路径。
- 转到项目属性 -> Java 构建路径。
- 将外部 Jar 添加到您的类路径中。
- 选择 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
相关文章
从 Java 中的另一个类访问变量
发布时间:2023/10/10 浏览次数:96 分类:Java
-
这篇文章是关于从另一个 Java 类访问变量的。本文介绍如何在 Java 中从另一个类调用变量。我们已经包含了一些示例程序,你可以按照它来执行这个项目。
从 Java 资源中读取文件
发布时间:2023/08/12 浏览次数:210 分类:Java
-
本文将展示如何使用 Java 编程语言从资源中读取文件。你只需要一个源文件路径。在 Java 中如何从资源中读取文件
如何在 Java 中从数组创建数组列表
发布时间:2023/08/11 浏览次数:142 分类:Java
-
本文将介绍在 Java 中从数组创建数组列表的不同方法。在 Java 中,有三种不同的方法可以将数组转换为数组列表,如 Arrays.asList()、Collections.addAll() 和 add()。
如何在 Java 代码中调用 Python 脚本
发布时间:2023/08/07 浏览次数:254 分类:Java
-
本文介绍了从 Java 代码调用 Python 脚本的三种不同方法。从 Java 代码调用 Python 脚本 有时,我们必须从Java代码中调用Python脚本来满足项目需求。
从 Java 代码调用外部 JavaScript 函数
发布时间:2023/06/03 浏览次数:205 分类:JavaScript
-
在本文中,我们将学习如何在 Java 程序中包含 JavaScript 源代码并从 Java 代码调用 JavaScript 函数。
从 Java 文件中读取整数
发布时间:2023/05/15 浏览次数:158 分类:Java
-
要从文件中读取整数,我们使用 BufferedReader 读取文件并使用 parseInt() 方法从数据中获取整数。 本教程演示了如何使用 Java 从文件中读取整数的分步过程。从 Java 文件中读取整数
如何从 Java 中的字符串中删除子字符串
发布时间:2023/03/26 浏览次数:154 分类:Java
-
本教程说明如何使用多种方法从 Java 中的任何给定字符串中删除子字符串,例如使用 repalce(),replaceAll()和 StringBuffer()。
Switch 语句从 Java 7 到 Java 17 的演变
发布时间:2022/08/01 浏览次数:160 分类:Java
-
Java 中的 Switch 语句自 Java 7 以来经历了快速发展。 因此,在本文中,我们将通过示例讨论 switch 语句从 java 7 到 java 17 的演变或变化。