文章目录
- 使用 Jython 在 Java 中运行 Python
- 创建 Python 代码
- 安装 Jython 库
- 将 Jython 库与 IDE 链接
- 用 Java 编写 Python 代码并编译它
- 用 Java 编译的用于添加两个数字的 Python 代码
- 用 Java 编译的用于查找月份最后一天的 Python 代码
- 一些用 Java 编译时不运行的 Python 库
- 总结
本文将彻底解释使用 Jython 库在 Java 程序中运行 Python 的步骤。 这将是一个包含大量图像的详细分步过程,因此您不必担心“他是怎么做到的”。
使用 Jython 在 Java 中运行 Python
在 Java 中运行 Python 需要三个先决条件。
- Python 代码。
- Jython 库。
- 可以链接 Jython 库的 IDE。
创建 Python 代码
让我们来看一个简单的 python 程序,它调用一个方法来添加两个数字。 方法 add() 有两个参数并返回这两个参数的总和并打印它们。
def add(a, b):
s = a + b
return s
print(add(5, 6))
运行这个程序会打印 a 和 b 的总和。
让我们看看另一个使用内置库的 python 程序。 该程序使用 datetime 内置库来查找任何给定月份的最后一天。
import datetime
def last_day_of_month(date):
if date.month == 12:
return date.replace(day=31)
return date.replace(month=date.month + 1, day=1) - datetime.timedelta(days=1)
print(last_day_of_month(datetime.date(2022, 12, 25)))
在该程序的最后一行,它将日期发送到方法 last_day_of_month,返回该月的最后一天并打印出来。
我们还考虑另一个在代码中使用第三方库的程序。
from datetime import datetime
import pandas as pd
def check_month_end(date):
return date + pd.offsets.MonthEnd(0) # == date
print(check_month_end(datetime(2005, 2, 6)))
print(check_month_end(datetime(2004, 2, 29)))
该程序在代码中使用了 pandas。 由于准备了一些将用于在 Java 程序中运行 Python 的代码,让我们学习如何安装 Jython。
安装 Jython 库
Jython 使得从 Java 代码调用 Python 函数变得简单,前提是 Python 代码本身在 Jython 下运行并且不使用任何不受支持的 C 扩展。
如果适合您,这无疑是可以找到的最简单的答案。 如果没有,可以使用新的 Java6 解释器,它支持 org.python.util.PythonInterpreter 语法。
Jython 库可以从这里下载。 读者应下载独立库版本,这将有助于轻松地将其与 IDE 链接。
该软件包将安装在您的机器上。 请务必记下它的下载路径。
在大多数机器上,它可以在主库内的“下载”下找到。
将 Jython 库与 IDE 链接
使用 IDE 是当前的标准,如果不是这种情况,读者必须切换到它。 本文将进一步演示 IntelliJ IDE 中的步骤,IntelliJ IDE 是一种非常流行的运行 java 代码的软件。
如果读者以前从未使用过 IntelliJ,请不要担心。 一切都将从头开始。
首先,从这里安装 IntelliJ。 安装 IntelliJ 并准备好使用后,需要创建一个新项目。
一个项目会为本文演示所需要的文件创建一个单独的空间。 然后项目将链接到 Jython 库,这样我们就可以在 java 中运行 python。
- 在 IntelliJ IDE 中创建一个新项目
打开 IntelliJ IDE,然后单击“新建项目”。 如果项目已经打开,请转至文件>新建>项目。
- 选择语言
在此步骤中,必须为项目选择正确的语言。 选择没有额外包的 Java 语言(Groovy 和 Kotlin 复选框必须保持未选中状态)。
对话框顶部的“项目 SDK”显示 Java 版本。 如果那里没有显示任何内容,请单击最右侧的小三角形下载一个新的。
- 启用命令行提示
勾选复选框以启用“命令行应用程序”,然后单击“下一步”。
- 为项目命名
为项目取一个合适的名称。 在本例中,项目名为 Python_in_Java。
单击完成将创建一个新项目。 - 将 Jython 库添加到在 IntelliJ IDE 中创建的项目
当一个新项目被创建时,它看起来像下图。 有一些标准代码的主类文件。
现在要将 Jython 链接到它,转到文件 > 项目结构。 将弹出一个新对话框。在库部分中,单击 + 图标并从菜单中选择“Java”。
选择 Java 将加载一个新的对话框,让我们从计算机浏览文件。 现在是时候记住我们下载的独立 Jython 文件的路径了。选择我们下载的 .jar 文件并单击 Ok。
再次单击 Ok,它将加载 Jython Standalone.jar,并将显示在库窗口中。 最后点击确定完成加载。
由于 Jython 被加载到这个库中,我们现在可以轻松地在 java 程序中编写代码和运行 python。
用 Java 编写 Python 代码并编译它
当项目创建并与 Jython 库链接时,可以编写 Java 代码以在 java 中运行 python。
Java 程序使用 Jython 库中的子函数 PythonInterpreter 在 JVM(Java 虚拟机)中启动内部解释器。
%> 请注意
,Jython 库仅支持 Python 2.7。 需要较新 Python 版本的脚本可以支持封装 Python 代码并在其他语言中运行的微 Web 服务,但这可能是一个复杂而漫长的过程。
Jython 最适合希望将 Jython 库集成到他们的系统中以让最终用户创建简单或复杂的脚本以扩展应用程序功能的 Java 程序员。
最后,Python 应用程序比 Java 应用程序短 2-10 倍。 这直接影响程序员的工作效率。
Python 和 Java 沟通良好,允许程序员在产品开发和编译过程中自由混合两种语言。
首先,需要创建一个在Java中运行Python的Java程序。
package com.company;
import org.python.util.PythonInterpreter;
public class Main {
public static void main(String[] args) {
PythonInterpreter pythonInterpreter = new PythonInterpreter();
pythonInterpreter.exec(""); // <--Python codes must be written inside this double quotes
}
}
让我们了解上面的代码做了什么。
- 第一行代码是 Java 程序的标准 IntelliJ 头文件。
- 来自 Jython 的 PythonInterpreter 子包在第二行导入。
- 定义了一个主类。 如果您是 Java 新手,则必须知道每个 Java 程序都有一个类,至少在程序内部是这样。
- 在类内部,定义了 main 方法。 这个程序直接跳转到main方法,没有创建函数来降低复杂度。 类名与 Main 方法相同,但并非总是必需的。
任何名称都可以是符合某些命名约定的类名。
- PythonInterpreter 的一个实例被创建为 pythonInterpreter。 这些实例在 Java 中称为对象,创建它们后,可以在主函数内部使用它们来调用导入的函数。
- 最后,代码写在
pythonInterpreter.exec();
使用双引号的语法。 我们的 Python 代码没有被解释,尽管 PythonInterpreter 类名暗示了什么。
JVM 在 Jython 中执行 Python 程序。 因此在运行之前,他们首先要转换为Java字节码。
尽管 Jython 是 Python 的 Java 版本,但它可能没有与原生 Python 完全相同的子包。
现在我们对如何使用 Jython 有了足够的了解。 让我们测试一下我们在本文开始时准备的 python 代码。
用 Java 编译的用于添加两个数字的 Python 代码
在 IntelliJ IDE 中复制粘贴时,Python 代码会自动排列在双引号内。
package com.company;
import org.python.util.PythonInterpreter;
public class Main {
public static void main(String[] args) {
PythonInterpreter pythonInterpreter = new PythonInterpreter();
pythonInterpreter.exec("def add(a, b):\n" +
" s = a + b\n" +
" return s\n" +
"\n" +
"print(add(5, 6))");
}
}
输出:
C:\java-1.8.0-openjdk-1.8.0.322-2.b06.dev.redhat.windows.x86_64\bin\java.exe ...
11
用 Java 编译的用于查找月份最后一天的 Python 代码
在第二个程序中,我们使用本机 Python 库来查找该月的最后一天。 正如我们所知,Python Interpreter 不会加载所有的本地库,尽管 datetime 库是可用的。
package com.company;
import org.python.util.PythonInterpreter;
public class Main {
public static void main(String[] args) {
PythonInterpreter pythonInterpreter = new PythonInterpreter();
pythonInterpreter.exec("import datetime\n" +
"\n" +
"\n" +
"def last_day_of_month(date):\n" +
" if date.month == 12:\n" +
" return date.replace(day=31)\n" +
" return date.replace(month=date.month + 1, day=1) - datetime.timedelta(days=1)\n" +
"\n" +
"\n" +
"print(last_day_of_month(datetime.date(2022, 12, 25)))\n");
}
}
输出:
C:\java-1.8.0-openjdk-1.8.0.322-2.b06.dev.redhat.windows.x86_64\bin\java.exe ...
2022-12-31
一些用 Java 编译时不运行的 Python 库
当一个程序运行时使用了Java无法导入的第三方库,如Pandas,它会显示错误。
package com.company;
import org.python.util.PythonInterpreter;
public class Main {
public static void main(String[] args) {
PythonInterpreter pythonInterpreter = new PythonInterpreter();
pythonInterpreter.exec("from datetime import datetime\n" +
"\n" +
"import pandas as pd\n" +
"\n" +
"\n" +
"def check_month_end(date):\n" +
" return date + pd.offsets.MonthEnd(0) # == date\n" +
"\n" +
"\n" +
"print(check_month_end(datetime(2005, 2, 6)))\n" +
"\n" +
"print(check_month_end(datetime(2004, 2, 29)))");
}
}
输出:
C:\java-1.8.0-openjdk-1.8.0.322-2.b06.dev.redhat.windows.x86_64\bin\java.exe ...
Exception in thread "main" Traceback (most recent call last):
File "<string>", line 3, in <module>
ImportError: No module named pandas
让我们来看另一个内置库 syds。
package com.company;
import org.python.util.PythonInterpreter;
public class Main {
public static void main(String[] args) {
PythonInterpreter pythonInterpreter = new PythonInterpreter();
pythonInterpreter.exec("import syds");
}
}
输出:
C:\java-1.8.0-openjdk-1.8.0.322-2.b06.dev.redhat.windows.x86_64\bin\java.exe ...
Exception in thread "main" Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named syds
总结
我们已经学习了如何使用 Jython 在 Java 中运行 python。 这些代码主要介绍了如何使用以及何时使用 Jython。
读者可以很容易地创建在 java 中运行 python 的程序。 希望本文对大家的编码之旅有所帮助。