从 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
相关文章
Python 中的位掩码简介
发布时间:2023/06/27 浏览次数:125 分类:Python
-
本篇文章介绍了 Python 中的位掩码,并演示了如何使用按位运算符(例如 AND、OR、NOT 等)执行位掩码。Python 中的位掩码简介 位掩码是几乎所有编程语言的通用概念;
在 Ubuntu 中卸载 Python
发布时间:2023/06/27 浏览次数:158 分类:Python
-
本文演示如何从 Ubuntu 中删除或卸载 Python。检查你的系统中是否安装了Python 使用 Ctrl+Alt+T 打开终端。打开终端后,使用命令 python3 --version 检查您的系统是否安装了 python。
Python Teradata 连接
发布时间:2023/06/27 浏览次数:86 分类:Python
-
本文将讨论一些基本的正确准则,并在讨论连接方式之前了解 Teradata 模块的工作原理。Python 中的 Teradata 数据库 您可以使用 Python 和 Teradata 模块编写与 Teradata 数据库的强大交互脚本。
在 Python 中查找素因数
发布时间:2023/06/27 浏览次数:175 分类:Python
-
本篇文章将介绍如何在 Python 中执行素因数分解。质因数分解概述 在数学中,数字的因子是那些可以除以给定数字且余数为零的数字。
在 Python 中从 URL 中提取域
发布时间:2023/06/27 浏览次数:86 分类:Python
-
本文将通过实际例子来讲解Python的 urlparse() 函数从URL中解析并提取域名。 我们还将讨论提高解析 URL 和使用其不同组件的能力。使用 urlparse() 从 URL 中提取域
Python 中的省略号对象
发布时间:2023/06/27 浏览次数:158 分类:Python
-
本篇文章将介绍 Python 中省略号对象的使用。使用省略号作为未编写代码的占位符 省略号对象可以以不同的方式使用。 它主要充当未编写代码的占位符。
实现 Python Builder 模式的不同方法
发布时间:2023/06/27 浏览次数:70 分类:Python
-
构建器模式是一种允许对象的创建与其表示分离的模式。 这种模式可以创建和配置复杂的对象而无需继承,这是一种强大但不灵活的方法。
Python 中的互相关
发布时间:2023/06/27 浏览次数:81 分类:Python
-
互相关是一种重要的信号处理方法,用于分析具有不同滞后的两个信号之间的相似性。 您不仅可以了解两个信号的匹配程度,还可以获得它们最相似的时间点或索引。本文将讨论在 Python 中处理
使用 Python Timedelta 月份计算日期
发布时间:2023/06/27 浏览次数:128 分类:Python
-
在本篇文章中,我们将通过 timedelta 学习如何在 Python 中使用日期时间。 我们将了解如何计算当前日期或任何其他日期六个月后的日期。