如何在 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
转载请发邮件至 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 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,