记录一次使用python调用java代码

Python调用Java代码的主要原理是通过使用Java虚拟机(JVM)和相关的库/工具实现的。

在Python中,可以使用以下几种方式来调用Java代码:

  1. 使用subprocess模块:可以通过subprocess模块来启动一个子进程,并在子进程中执行Java程序。这种方式适用于简单的Java程序调用,但不便于在Python和Java之间交换数据。

  2. 使用pyjniuspy4j等第三方库:这些库提供了Python与Java之间的桥接,允许在Python中直接调用Java类和方法。它们在底层使用JNI(Java Native Interface)或Socket通信来实现Python与Java之间的交互。

  3. 使用jpype库:jpype是一个Python库,它提供了一个Python到Java的桥接,允许直接调用Java类和方法。它包装了JNI,提供了更高层次的Python API来与Java交互。jpype库需要先启动JVM,然后将Java类加载到JVM中,并通过Python调用Java方法。

无论使用哪种方式,它们都依赖于Java虚拟机的存在。在调用Java代码之前,需要确保已经正确安装并配置了Java环境。Python与Java之间的交互主要通过JNI、Socket通信或其他机制来实现数据传输和方法调用。

总结起来,Python调用Java代码的原理是通过与Java虚拟机进行交互,将Java类加载到JVM中,并通过适当的接口或桥接来调用Java方法。

其中,使用subprocess模块最简单,并且上述方式都是需要将java代码打包成jar包之后即可使用,

要在Python中调用Java的jar文件,你可以使用subprocess模块来执行Java命令,并传递jar文件的路径和相关参数。

下面是一个示例代码:

import subprocessjar_path = "/path/to/your.jar" # 替换为你的jar文件路径java_command = ["java", "-jar", jar_path] # 构建Java命令# 运行Java jar文件subprocess.call(java_command)

在上述代码中,你需要将jar_path变量替换为实际的jar文件路径。然后,使用subprocess.call()函数来执行Java命令。

如果你的Java jar文件需要接受参数,你可以在java_command列表中添加相应的参数,如:

java_command = ["java", "-jar", jar_path, "arg1", "arg2", ...] # 添加jar文件需要的参数

请注意,这只是一个简单的示例,你可能需要根据你的具体情况进行适当的调整。另外,确保已经安装了正确版本的Java Development Kit(JDK),以便能够在Python中执行Java命令。

在配置jar包位置时可能会用到的,动态获取绝对位置:

在Python中,你可以使用os模块的path子模块来获取文件或目录的绝对路径。以下是几种常见的方法:

1、使用os.path.abspath()函数:该函数接受一个文件或目录的相对路径,并返回其绝对路径。示例如下:

import os 
relative_path = 'my_directory/my_file.txt' 
absolute_path = os.path.abspath(relative_path) 
print(absolute_path)

输出:

​​​​​​​/home/user/my_project/my_directory/my_file.txt

2、使用os.getcwd()函数与相对路径拼接:os.getcwd()函数返回当前工作目录的绝对路径,你可以将其与相对路径进行拼接来获取文件或目录的绝对路径。示例如下:

import os 
relative_path = 'my_directory/my_file.txt' 
absolute_path = os.path.join(os.getcwd(), relative_path) 
print(absolute_path)

输出:

/home/user/my_project/my_directory/my_file.txt

3、使用__file__变量:在模块中,__file__变量包含当前模块的文件路径,你可以使用它来构建文件的绝对路径。示例如下:

import os 
relative_path = 'my_directory/my_file.txt' 
absolute_path = os.path.abspath(os.path.join(os.path.dirname(__file__), relative_path)) 
print(absolute_path)

输出:

/home/user/my_project/my_directory/my_file.txt

无论哪种方法,都可以根据相对路径获取文件或目录的绝对路径。选择适合你需求的方法,并且根据实际情况进行相应的调整。

其他说明:

所有跨语言调用不是直接调用java代码,而是需要将java代码打包为jar包,并且需要在环境变量中设置JAVA_HOME的变量,不论是否使用到,但一定要是正确的jdk环境变量,并且这个变量如果是临时设置的必须重启计算机,否则获取不到。

构建jar包:

1.“File"—>"Project Structure"—>"Artifacts".

2.依次点击图1中的”+”—>"JAR"—>"From modules with dependencies".

3.选择需要打包的模块(Module:)—>选择该JAR包的入口类(Main Class:)—>“OK”,

4.单击OK之后会回到代码编辑界面,此时JAR还未生成,单击“Build"—>”Build Artifacts",

5.完成图5中的两步后会弹出一个新窗口,单击图中“Build”,

6.构建成功的jar包会输出到/out/artifacts/目录下,之后再次编译时,如果出现问题可以先clean再rebuild。

7.IDEA项目文件中的jar包如何运行,右击out目录下的xxx.jar—>“Open in Terminal"—>输入命令:java -jar xxx.jar 即可运行该jar包。

为了避免打包jar包有问题,可以在打包完毕后使用以下命令来避免这个错误:

//错误演示
java -jar /lib/xxxx.jar
Error: Unable to access jarfile /lib/xxx.jar//正确演示
java -jar /lib/xxx.jar

下面这些方法有包括: startJVM时总是失败,class总是找不到的问题暂时未解决。

具体先看示例代码吧。

要在Python中调用Java代码,你可以使用jpype模块。jpype是一个Python模块,允许你直接在Python中与Java进行交互。

首先,确保你已经安装了Java Development Kit(JDK)和Python的jpype模块。然后,按照以下步骤进行操作:

1、导入jpype模块:

import jpype

2、启动JVM(Java虚拟机):

jpype.startJVM()

3、加载Java类:

java_class = jpype.JClass("包名.类名")

注意替换"包名"和"类名"为你要调用的Java类的实际包名和类名。

4、创建Java对象:

java_object = java_class() # 如果是静态方法,则不需要创建对象

5、调用Java方法:

result = java_object.methodName(argument1, argument2, ...) # 替换为具体的方法名和参数

6、停止JVM:

jpype.shutdownJVM()

错误方法2:

要使用 pyjnius 库在 Python 中调用 Java 代码,可以按照以下步骤进行::

1、安装 pyjnius 库:在终端或命令提示符中运行以下命令来安装 pyjnius

pip install pyjnius

2、准备 Java 类文件:将要调用的 Java 类文件编译为 .class 文件。确保你有 Java 环境并设置了正确的 Java 环境变量。

3、编写 Python 代码:在 Python 脚本中引入 jnius 模块,并通过 autoclass 方法导入 Java 类。然后就可以实例化 Java 类并调用其方法了。

from jnius import autoclass 
# 导入 Java 类 
MyClass = autoclass('com.example.MyClass') 
# 实例化 Java 类 
my_object = MyClass() 
# 调用 Java 方法 
result = my_object.myMethod()

替换 com.example.MyClass 为你要导入的 Java 类的完整路径。

4、设置 Java 类路径(可选):如果需要导入的 Java 类不在默认的类路径中,可以通过设置 CLASSPATH 环境变量或使用 autoclass.add_classpath() 方法来添加 Java 类所在的路径。

from jnius import autoclass 
# 设置 Java 类路径 
autoclass.add_classpath('/path/to/myclass.jar') 
# 导入 Java 类 
MyClass = autoclass('com.example.MyClass')

替换 /path/to/myclass.jar 为你的 Java 类所在的 JAR 文件路径。

这样,你就可以使用 pyjnius 在 Python 中调用 Java 代码了。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop Hbase Hive 版本对照一览

这里写目录标题 一、Hadoop 与 Hbase 版本对照二、Hadoop 与 Hive 版本对照 官网内容记录,仅供参考 一、Hadoop 与 Hbase 版本对照 二、Hadoop 与 Hive 版本对照

怎样学会单片机

0、学单片机首先要明白,一个单片机啥也干不了,学单片机的目的是学习怎么用单片机驱动外部设备,比如数码管,电机,液晶屏等,这个需要外围电路的配合,所以学习单片机在这个层面上可以等同为学习单片…

Linux简介及基础操作

简介: 1、linux和windows都是操作系统,多任务,多用户,多线程… Linux免费使用,自由传播,开源 2、Linux 发行版(都是基于linux内核穿的外套) Ubuntu——嵌入式开发 fedora——早期嵌入…

Gradio:交互式Python数据应用程序的新前沿

一、说明 什么是Gradio以及如何使用Gradio在Python中创建DataApp或Web界面?使用 Gradio 将您的 Python 数据科学项目转换为交互式应用程序。 摄影:Elijah Merrell on Unsplash Gradio是一个Python库,允许我们快速为机器学习模型创建可定制的接…

c语言——三子棋

基本框架 三个文件: 其中.cpp文件用于游戏具体函数设计&#xff0c;.h文件为游戏的函数声明&#xff0c;test.cpp文件用于测试游戏运行。 需要用到的头文件&#xff1a; #include <stdio.h> #include <stdlib.h>//rand&srand #include <time.h>//时间相…

【linux】ssh 和adb connect区别

问&#xff1a;ssh 与ping的区别 答&#xff1a;SSH&#xff08;Secure Shell&#xff09;和Ping是两种完全不同的网络工具。 SSH是一种加密的网络协议&#xff0c;用于安全地远程管理或访问远程计算机。它提供了一种安全的通信方式&#xff0c;可以在不安全的网络上进行远程登…

03.利用Redis实现缓存功能---解决缓存穿透版

学习目标&#xff1a; 提示&#xff1a;学习如何利用Redis实现添加缓存功能解决缓存穿透版 学习产出&#xff1a; 缓存穿透讲解图&#xff1a; 解决方案&#xff1a; 采用缓存空对象采用布隆过滤器 解决方案流程图&#xff1a; 1. 准备pom环境 <dependency><gro…

【css】textarea-通过resize:none 禁止拖动设置大小

使用 resize 属性可防止调整 textareas 的大小&#xff08;禁用右下角的“抓取器”&#xff09;&#xff1a; 没有设置resize:none 代码&#xff1a; <!DOCTYPE html> <html> <head> <style> textarea {width: 100%;height: 150px;padding: 12px 20p…

【MySQL】sql字段约束

在MySQL中&#xff0c;我们需要存储的数据在特定的场景中需要不同的约束。当新插入的数据违背了该字段的约束字段&#xff0c;MySQL会直接禁止插入。 数据类型也是一种约束&#xff0c;但数据类型这个约束太过单一&#xff1b;比如我需要存储的是一个序号&#xff0c;那就不可…

页面的滚动及scrollIntoView的穿透效果和解决

朋友今天遇到一个奇怪的问题&#xff0c;我觉得很有意思就记录一下。现象是这样的&#xff0c;页面有一个按钮&#xff0c;点击按钮以后会请求一个接口拿到一个iframe的地址然后创建一个iframe并渲染到页面上&#xff0c;iframe的页面加载完毕后会滑动到对应的某一个元素的位置…

Transformer学习笔记

Transformer学习笔记 前言前提条件相关介绍Transformer总体架构编码器&#xff08;Encoder&#xff09;位置编码&#xff08;Positional Encoding&#xff09;get_attn_pad_mask函数&#xff08;Padding Mask&#xff09;EncoderLayerMultiHeadAttentionScaledDotProductAttent…

前端开发常见效果

目录 css实现图像填充文字 css实现手风琴效果 css实现网站变灰色 elementUi的导航栏效果 css实现滚动吸附效果 鼠标经过&#xff0c;元素内部放大 css实现图像填充文字 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta c…

day17 enum abstract interface 枚举 抽象 接口

一、枚举 enum 枚举本来的面目 创建Season类&#xff0c; 所有类都默认继承Object&#xff0c;写不写都一样 声明属性 &#xff1a;季节的名字、 季节的描述&#xff0c; 因为枚举的对象是看的见的客观事物&#xff0c; 想让它的属性不可修改 使用 final修饰表示最终的 &am…

4.DNS和负载均衡

文章目录 coreDNS概念部署croeDNS测试 kubernetes多master集群结构master节点部署 负载均衡配置部署nginx做四层反向代理安装高可用 keepalivednginx监控脚本修改k8s中组件的配置文件 coreDNS 概念 coreDNS是kubernetes的默认DNS实现。可以为集群中的service资源创建一个资源名…

SQL Server 查询数据并汇总相关技巧 23.08.08

GROUPING 是一个聚合函数,它产生一个附加的列&#xff0c;当用 CUBE 或 ROLLUP 运算符添加行时&#xff0c;附加的列输出值为1&#xff0c;当所添加的行不是由 CUBE 或 ROLLUP 产生时&#xff0c;附加列值为0。 仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择…

安卓证书生成教程

1.下载安装JDK文件&#xff08;如已安装请跳过&#xff09; 根据电脑系统版本下载JDK版本文件 下载地址&#xff1a;[https://www.oracle.com/java/technologies/downloads/](https://www.oracle.com/java/technologies/downloads/) 如果电脑上安装过JDK文件可以跳过2.生成密钥…

怎么制作gif动态图?gif图片在线制作攻略分享

现在许多品牌和营销活动也使用gif动态图来吸引用户注意力、提升品牌形象或传递特定的信息&#xff0c;那么gif制作的过程到底难不难呢&#xff1f;其实只需要使用gif图片在线制作工具就非常简单了&#xff0c;下面以图片制作gif&#xff08;https://www.gif.cn&#xff09;为例…

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy

Unity游戏源码分享-塔防游戏保卫兔子的食物CarrotFantasy 经典塔防游戏&#xff0c;可发布PC、Andoid、IOS、Web等 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88189987

计算机网络体系结构

计算机网络体系结构 常用的网络体系结构 OSI体系结构 为了使不同体系结构的计算机网络都能互连&#xff0c;国际标准化组织于1977年成立了专门机构研究该问题&#xff0c;不就他们就提出了一个试图使各种计算机在世界范围内互连成网的标准框架&#xff0c;也就是著名的开放系…

rancher + k3s + docker私有仓库搭建K8环境(百分之百成功)

1.环境准备&#xff08;4台机器&#xff09; 文档准备了4台虚拟机&#xff0c;系统是ubuntu server: ubuntu-22.04.1-live-server-amd64.iso 然后进行安装4台虚拟机&#xff0c;如图&#xff1a; 其中一台用于rancher、其余三台跑K8&#xff0c;一台master&#xff0c;两台工作…