从Java代码中调用Python脚本
本教程演示了从 Java 代码中调用 Python 脚本的三种不同方法。
从 Java 代码中调用 Python 脚本
有时,我们必须从Java代码中调用Python脚本以满足项目要求。我们可以使用Process
,ProcessBuilder
, 和Jython
来做到这一点。让我们看看下面如何使用它们中的每一个。
使用Process
类从 Java 代码中运行 Python 脚本
我们可以使用 Java 的Process
类来从我们的 Java 代码中运行 Python 脚本。让我们试着创建一个Python脚本并使用Java代码运行它。按照下面的步骤进行:
- 在Java中的一个字符串中复制你的Python脚本。
- 使用
BufferedWriter
创建一个扩展名为.py
的文件。 - 将上述字符串中的内容写入Python文件中,并关闭写入器。
- 使用
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 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 脚本:
- 确保Python已经安装在你的系统上。
- 创建一个带有
.py
扩展名的 Python 脚本,或者如果你已经有了一个,就选择一个。 - 创建一个
ProcessBuilder
类的实例,并将python
和脚本路径作为参数传递。 - 使用
start()
方法创建一个进程来运行ProcessBuilder
;这将执行 Python 脚本。 - 创建一个
BufferedReader
,从进程中获得Python脚本的输出。 - 打印输出。
让我们用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环境中:
- 从这里下载
Jython Standalone
。 - 将
Jython-standalone-2.7.2.jar
添加到你的构建path
。 - 转到项目
Properties
->Java Build Path
。 - 添加外部Jar到你的
classpath
。 - 选择
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