迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

使用 Jython 在 Java 中运行 Python

作者:迹忆客 最近更新:2023/06/18 浏览次数:

本文将彻底解释使用 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 独立下载

该软件包将安装在您的机器上。 请务必记下它的下载路径。

在大多数机器上,它可以在主库内的“下载”下找到。


将 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 的程序。 希望本文对大家的编码之旅有所帮助。

上一篇:Python 图像压缩

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python 图像压缩

发布时间:2023/06/18 浏览次数:157 分类:Python

本篇文章将介绍使用 Python 中的 PIL 库压缩图像。在使用 PIL 库之前,请使用 pip 或 python 安装它。pip install Pillow

在 Python 中调整图像大小同时保持其纵横比

发布时间:2023/06/18 浏览次数:187 分类:Python

这篇 Python 文章的目的是解释我们如何在 Python 中调整图像大小同时保持其纵横比。 在 Python 中调整图像大小的方法还将通过适当的示例程序描述其用法。在 Python 中调整图像大小同时保持其纵横

Python类相等检查

发布时间:2023/06/18 浏览次数:130 分类:Python

本文讨论如何在 Python 中检查类相等性。 为此,本文讨论了如何在 Python 类中实现 eq() 方法。

Python 类工厂

发布时间:2023/06/18 浏览次数:83 分类:Python

本篇文章介绍了创建类工厂的不同方法。如何在 Python 中创建类工厂 有两种设计类工厂的方法; 一个在编码时创建一个类,而另一个在运行时创建一个类。

Python 抽象属性

发布时间:2023/06/18 浏览次数:99 分类:Python

本篇文章将介绍使用 abc 或抽象基类模块在 Python 中创建具有抽象属性的类。Python 抽象属性 面向对象编程中的抽象用于向用户隐藏不必要的信息。

Python 中的数据类继承

发布时间:2023/06/18 浏览次数:122 分类:Python

本文解释了数据类、继承、多级继承、默认和非默认属性等概念。 提供了足够的编码示例以掌握编译过程中展开的概念。

Python 生成器类

发布时间:2023/06/18 浏览次数:185 分类:Python

本篇文章将讨论使用 yield 语句和 next() 函数在 Python 中创建生成器类。要了解生成器,我们首先需要了解下面讨论的迭代器。Python 迭代器是用于逐个访问容器中元素的对象。

在 Python 中实现多个装饰器

发布时间:2023/06/17 浏览次数:95 分类:Python

本文重点介绍多个装饰器的概念。 读者将学习装饰器的基础知识,它是如何创建和实现的,以及如何将它与其他装饰器链接到一个函数上。

使用 Python 装饰器重试代码块

发布时间:2023/06/17 浏览次数:94 分类:Python

在这种情况下,修改会在给定情况下多次重试函数,其返回值可能与我们想要的不同。@retry 装饰器的重要性 我们可以使用装饰器来扩展特定函数的行为,我们可以轻松地创建装饰器来修改该函

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便