使用 Jython 在 Java 中运行 Python


本文将彻底解释使用 Jython 库在 Java 程序中运行 Python 的步骤。 这将是一个包含大量图像的详细分步过程,因此您不必担心“他是怎么做到的”。


使用 Jython 在 Java 中运行 Python

在 Java 中运行 Python 需要三个先决条件。

  1. Python 代码。
  2. Jython 库。
  3. 可以链接 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 版本。 如果那里没有显示任何内容,请单击最右侧的小三角形下载一个新的。


    intellij new project 2
  • 启用命令行提示

    勾选复选框以启用“命令行应用程序”,然后单击“下一步”。


    启用命令行提示符
  • 为项目命名

    为项目取一个合适的名称。 在本例中,项目名为 Python_in_Java。


    为项目命名
    单击完成将创建一个新项目。
  • 将 Jython 库添加到在 IntelliJ IDE 中创建的项目

    当一个新项目被创建时,它看起来像下图。 有一些标准代码的主类文件。
    新项目预览
    现在要将 Jython 链接到它,转到文件 > 项目结构。 将弹出一个新对话框。

    在库部分中,单击 + 图标并从菜单中选择“Java”。
    在新项目库中选择 Java
    选择 Java 将加载一个新的对话框,让我们从计算机浏览文件。 现在是时候记住我们下载的独立 Jython 文件的路径了。

    选择我们下载的 .jar 文件并单击 Ok。
    选择jython
    再次单击 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
    }
}

让我们了解上面的代码做了什么。

  1. 第一行代码是 Java 程序的标准 IntelliJ 头文件。
  2. 来自 Jython 的 PythonInterpreter 子包在第二行导入。
  3. 定义了一个主类。 如果您是 Java 新手,则必须知道每个 Java 程序都有一个类,至少在程序内部是这样。
  4. 在类内部,定义了 main 方法。 这个程序直接跳转到main方法,没有创建函数来降低复杂度。 类名与 Main 方法相同,但并非总是必需的。

    任何名称都可以是符合某些命名约定的类名。

  5. PythonInterpreter 的一个实例被创建为 pythonInterpreter。 这些实例在 Java 中称为对象,创建它们后,可以在主函数内部使用它们来调用导入的函数。
  6. 最后,代码写在 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 的程序。 希望本文对大家的编码之旅有所帮助。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java调用Python代码有多种方法,其一种是使用JythonJython是一个Java平台上的Python解释器,它允许在Java程序嵌入Python代码,并且可以在Java代码直接调用Python模块和函数。 以下是使用JythonJava调用Python代码的基本步骤: 1. 下载并安装Jython 你可以从Jython官方网站下载Jython安装包,并按照安装向导进行安装。 2. 创建Python脚本 编写一个Python脚本,例如hello.py: ``` def say_hello(name): print("Hello, " + name + "!") ``` 3. 在Java代码加载并调用Python模块 在Java代码使用JythonPythonInterpreter类加载并调用Python模块和函数,例如: ``` import org.python.util.PythonInterpreter; public class Main { public static void main(String[] args) { PythonInterpreter interpreter = new PythonInterpreter(); interpreter.execfile("hello.py"); interpreter.get("say_hello").__call__("John"); } } ``` 在上面的代码,我们首先创建了一个PythonInterpreter对象,然后使用它的execfile方法加载Python脚本文件。接着,我们使用interpreter.get方法获取Python模块的say_hello函数,并使用__call__方法调用该函数,并传递一个参数。 当你运行Java程序时,你应该能够在控制台上看到输出:Hello, John! 需要注意的是,Jython并不是Python的完全实现,它只支持Python 2.7的语法和一些标准库。如果你的Python代码使用了不受支持的语法或库,那么你需要考虑其他的方法来在Java调用Python代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迹忆客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值