使用 Jython 在 Java 中运行 Python

文章目录

    • 使用 Jython 在 Java 中运行 Python
      • 创建 Python 代码
    • 安装 Jython 库
    • 将 Jython 库与 IDE 链接
    • 用 Java 编写 Python 代码并编译它
    • 用 Java 编译的用于添加两个数字的 Python 代码
    • 用 Java 编译的用于查找月份最后一天的 Python 代码
    • 一些用 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 的程序。 希望本文对大家的编码之旅有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/78257.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

步入React正殿 - React组件设计模式

目录 扩展学习资料 高阶组件 /src/components/hoc/withTooltip.js /src/components/hoc/itemA.jsx /src/components/hoc/itemB.jsx /src/App.js 函数作为子组件【Render pprops】 函数作为子组件 /src/components/rp/itemC.jsx【父组件】 /src/components/rp/withToo…

Java版电子招投标管理系统源码-电子招投标认证服务平台-权威认证 tbms

​ 功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;…

Java进阶篇--数据结构

目录 一.数组&#xff08;Array&#xff09;&#xff1a; 1.1 特点&#xff1a; 1.2 基本操作&#xff1a; 1.3 使用数组的好处包括&#xff1a; 1.4 数组也有一些限制&#xff1a; 二.集合框架&#xff08;Collections Framework&#xff09;&#xff1a; 2.1 列表…

【TA 挖坑02】RayMarching SDF 物体黏合

写在前面 由于实习和忙着论文很久没经营博客了&#xff0c;最近以各种方式收集到了一些想实现的效果&#xff0c;其中一个就是卡通云融合、变大变小、聚散收拢的效果如何实现的问题&#xff0c;这就不得不提搁置了很久的RayMarching... 挖坑&#xff01;整理一下有帮助的文章…

Octree八叉树python

原理 简单示例&#xff1a; 假设我们有以下一组三维点云数据&#xff1a; points [[0.1, 0.1, 0.1],[0.4, 0.1, 0.1],[0.1, 0.4, 0.1],[0.4, 0.4, 0.1],[0.1, 0.1, 0.4],[0.4, 0.1, 0.4],[0.1, 0.4, 0.4],[0.4, 0.4, 0.4], ] 我们可以使用八叉树将这些点云数据存储在三维空…

MATLAB高分辨率图片

把背景调黑&#xff0c;把曲线调黄&#xff0c;把grid调白&#xff0c;调调字体字号的操作 close all a0:0.1:10; noise2*rand(1,length(a)); bsin(a)sin(3*a)noise;plot(a,b,y,linewidth,2); ylim([-3 4]) %y轴范围 set(gca,xgrid,on,ygrid,on,gridlinestyle,-,Grid…

8.13黄金是否进入下行通道?下周开盘如何布局

近期有哪些消息面影响黄金走势&#xff1f;黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(8月11日)现货黄金小幅收低&#xff0c;受累于美元走强和美国国债收益率上升&#xff0c;本周录得6月底以来最差单周表现。投资者在评估最新一批通胀报告和消费者信…

【hive】简单介绍hive的几种join

文章目录 前言1. Common Join2. Map Join介绍&#xff1a;使用方法&#xff1a;限制&#xff1a; 3. Bucket Map Join介绍&#xff1a;好处&#xff1a;使用条件&#xff1a;使用方法&#xff1a; 4. Sort Merge Bucket Map Join介绍&#xff1a;如何使用&#xff1a; 5. Skew …

使用 HTML、CSS 和 JavaScript 创建多步骤表单

使用 HTML、CSS 和 JavaScript 创建多步骤表单 为了处理又长又复杂的表单&#xff0c;我们需要将它们分成多个步骤。通过一次只在屏幕上显示一些输入&#xff0c;表单会感觉更容易理解&#xff0c;并防止用户感到被大量的表单字段淹没。 在本文中&#xff0c;我将逐步指导如何…

OSI七层模型及TCP/IP四层模型

目录 OSI七层模型 TCP/IP四层模型 OIS七层模型和TCP/IP模型图 七层详解 两种模型比较 为什么OSI七层体系结构不常用 四层详解 网络为什么要分层&#xff1f; 说说 OSI 七层模型和 TCP/IP 四层模型的关系和区别 OSI七层模型 OSI&#xff08;Open System Interconnect&a…

编译redis-5.0.9报错zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录问题解决

上图 解决&#xff1a; make && make install MALLOClibc原因: 原因是jemalloc重载了Linux下的ANSI C的malloc和free函数。

【Spring Boot】构建RESTful服务 — 实战:实现Web API版本控制

实战&#xff1a;实现Web API版本控制 前面介绍了Spring Boot如何构建RESTful风格的Web应用接口以及使用Swagger生成API的接口文档。如果业务需求变更&#xff0c;Web API功能发生变化时应该如何处理呢&#xff1f;可以通过Web API的版本控制来处理。 1.为什么进行版本控制 …

JVM中对象和GC Root之间的四种引用关系

1. 强引用 只有所有 GC Roots 对象都不通过【强引用】引用该对象&#xff0c;该对象才能被垃圾回收 由GC Root直接new出来的对象是强引用&#xff0c;只有当GC Root不再引用该对象的时候&#xff0c;才会被回收 例子&#xff1a; List<String> list new ArrayList<&…

【STM32】FreeRTOS事件组学习

事件组&#xff08;Event Group&#xff09; 一个任务执行之前需要经过多个条件进行判断&#xff0c;当条件全部满足或多个条件中的某一个条件满足才执行。 实验&#xff1a;创建两个任务&#xff0c;一个事件组&#xff0c;当按键一二三都按过一遍才打印。 实现&#xff1a…

STM32 CubeMX (Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)第二步

STM32 CubeMX STM32 CubeMX ____Freertos任务通信&#xff1a;队列、信号量、互斥量&#xff0c;事件组&#xff0c;任务通知 STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用…

【STM32+ESP8266上云连载①】给ESP8266烧录AT固件

文章目录 一、给NodeMCU烧录固件1.1硬件准备1.2软件准备1.3AT固件下载1.4配置设置1.5开始烧录 二、给ESP8266-01S烧录固件2.1硬件准备2.2AT固件下载2.3连线2.4烧录配置 三、给ESP-12E/F/S单片烧录固件四、指令测试4.1HTTP测试4.2MQTT测试 我在使用ESP8266的时候遇到了一些问题&…

智能仓储管理系统(自动化仓库管理解决方案)

企业实际的仓储管理中&#xff0c;往往会出现那样这样的错误&#xff0c;归根结底&#xff0c;主要是由于没使用合适的仓库管理工具。相反&#xff0c;人工使用合适的仓库管理工具&#xff0c;不仅可以在日常仓库管理方法中根据采集到的产品信息数据&#xff0c;大大地提高管理…

vue3学习笔记(一)

一、API风格 Vue 的组件可以按两种不同的风格书写&#xff1a;选项式 API 和组合式 API。 二、组合式API 1.&#xff08;组合式 API 的核心思想是直接在函数作用域内定义响应式状态变量&#xff0c;并将从多个函数中得到的状态组合起来处理复杂问题。这种形式更加自由&#x…

vue项目根据word模版导出word文件

一、安装依赖 //1、docxtemplaternpm install docxtemplater pizzip -S//2、jszip-utilsnpm install jszip-utils -S//3、pizzipnpm install pizzip -S//4、FileSaver npm install file-saver --save二、创建word模版 也就是编辑一个word文档&#xff0c;文档中需要动态取值的…

用 React+ts 实现无缝滚动的走马灯

一、走马灯的作用 走马灯是一种常见的网页交互组件&#xff0c;可以展示多张图片或者内容&#xff0c;通过自动播放或者手动切换的方式&#xff0c;让用户能够方便地浏览多张图片或者内容。 本次实现的不是轮播图而是像传送带一样的无限滚动的形式。 二、需求梳理 走马灯可设…