Python调用jar包方法实现过程解析

更多编程教程请到:菜鸟教程 https://www.piaodoo.com/

需求

最近在后台项目代码中一段自定义的AES加解密的程序在平时的测试工作中应用频繁。因为写脚本经常会需要使用,而经过各种尝试,比如jpype等,都不尽如人意。最后转换思路找到了一种好方法:

1. 将java项目打成jar包;

2. 设定jar包的Main-class属性;

3. 在python中通过subprocess执行jar包。

修改main函数打jar包

在intellij中打jar包:

1. File--> Project Structure... --> Artifacts --> + --> JAR --> From modules with dependencies --> OK --> 勾选Include in project build --> 记录上方Output directory路径 --> OK;

2. Build --> Build Project --> 之后就可以在Output directory路径看到打的jar包了;

3. 用WinRAR打开jar包,修改其中META-INF文件夹下的MANIFEST.MF文件,增加一行Main-class入口,例如:"Main-class: com.package.name.Classname",注意冒号后面空一格,文件最后空一行。

注意:执行jar包就是执行jar包的Main-class中的main函数。所以如果要在python中调用java方法并传参的话,要在打jar包前修改Main-class中的main方法,Main-class也就是目标java类。

在Main-class的main函数中可以设置传参:

String data= args[0];
String key = args[1];
// 调用解密程序并打印解密结果

这里data是密文,key是密钥。

编写python脚本

然后对应写python脚本,这里设定python文件名为aes.py,假定我们用来解密的jar包名为aes.jar:

import subprocess
import chardet
import sys

class AES(object):
def init(self, data, key):
self.data = data
self.key = key

def decrypt(self):
command = “java -jar aes.jar”
arg0 = self.data
arg1 = self.key
cmd = [command,arg0,arg1]
new_cmd = " ".join(cmd)
stdout,stderr = subprocess.Popen(new_cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()
encoding = chardet.detect(stdout)[“encoding”]
result = stdout.decode(encoding)
return result

if name == ‘main’:
data = sys.argv[1]
key = sys.argv[2]
AES = AES(data,key)
print(AES.decrypt())

这里为了与jar包的两个传参相对应也设置python脚本需要传入两个参数,第一个是待解密的数据data,第二个是解密钥匙key。

这里我们创建一个文件夹aes,将aes.py和aes.jar放到该文件夹下,二者同处于aes根目录下。

然后在当前目录下启动cmd,执行python脚本,传入data和key两个参数给python脚本:

python aes.py "待解密的字符串" "密钥"

在python脚本会将这两个参数再传递给jar包并调用jar包Main-class的main函数中调用解密过程并打印解密结果。

这样就可以在python中调用java的解密程序,从而打印出解密后的字符串了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持菜鸟教程www.piaodoo.com。

### 回答1: 在Java中调用Pythonjar包可以通过Java的ProcessBuilder类来实现。首先,需要确保Pythonjar包已经被正确地导入到Java的项目中。 接下来,可以使用如下代码来创建一个进程,执行Pythonjar包: ```java try { String pythonJarPath = "path/to/python.jar"; String pythonScriptPath = "path/to/python/script.py"; ProcessBuilder pb = new ProcessBuilder("java", "-jar", pythonJarPath, pythonScriptPath); Process process = pb.start(); // 等待进程执行完成 int exitCode = process.waitFor(); if (exitCode == 0) { System.out.println("Python脚本执行成功"); } else { System.out.println("Python脚本执行失败"); } } catch (Exception e) { e.printStackTrace(); } ``` 在上述代码中,需要将`pythonJarPath`和`pythonScriptPath`替换为实际的路径。 这段代码会创建一个进程,调用Java命令来执行Pythonjar包,并指定需要执行的Python脚本路径。执行完成后,可以通过`waitFor()`方法获取进程的退出码,根据退出码来判断Python脚本的执行结果。 需要注意的是,这种方式调用Pythonjar包是通过启动一个单独的进程来实现的,因此在执行过程中可能会有一定的性能开销。同时,需要确保Java和Python的环境配置正确,以及Pythonjar包和脚本路径正确。 ### 回答2: 在Java中调用Python jar文件,可以借助于Jython或者使用Java的ProcessBuilder类。 Jython是一个Java平台上的Python解释器,可以将Python代码集成到Java项目中。首先需要将Python jar文件导入到Java项目中,然后使用Jython的API来执行Python代码。通过将Python代码封装在Java方法中,可以在Java代码中直接调用方法实现Java调用Python的功能。 另一种方法是使用Java的ProcessBuilder类,通过创建一个新的进程来执行Python脚本。需要使用ProcessBuilder类来设置Python解释器的路径以及Python脚本的路径,然后启动新的进程执行Python脚本。通过获取进程的输出流,可以获取Python脚本的运行结果。 无论是使用Jython还是ProcessBuilder类,都需要确保Python环境已正确安装,并且Python脚本的路径等信息正确设置。Java和Python之间的交互还需要考虑数据类型转换、传递参数等问题,以确保正确的数据交互。 总之,通过Jython或者ProcessBuilder类,Java可以调用Python jar文件,实现Java与Python之间的交互。具体的实现方式需要根据实际需求和环境来选择。 ### 回答3: 在Java中调用Pythonjar文件,可以通过Java的Process类实现。以下是实现的步骤: 1. 在Java中,首先需要使用ProcessBuilder类创建一个新的进程,并指定执行Python脚本的命令。 ```java ProcessBuilder pb = new ProcessBuilder("python", "-jar", "path/to/python.jar"); ``` 2. 设置进程的工作目录,此处为可选步骤,可以根据实际情况进行设置。 ```java pb.directory(new File("path/to/directory")); ``` 3. 启动进程并等待其执行完成。 ```java Process process = pb.start(); int exitCode = process.waitFor(); ``` 4. 解析Python脚本的输出,可以通过InputStream读取进程的输出流。 ```java String output = readStream(process.getInputStream()); ``` 其中`readStream`方法是一个用于读取输入流并将其转换为字符串的辅助方法。 5. 可选步骤,如果需要向Python脚本传递参数,可以使用ProcessBuilder的`inheritIO()`方法,将输入、输出和错误流连接到当前进程的标准输入、输出和错误流。 ```java pb.inheritIO(); ``` 这样就可以将Java与Python的交互通过Pythonjar文件实现。注意,执行Python脚本需要在运行环境中安装Python,并将其添加到系统的环境变量中,以便在命令行中可以直接执行`python`命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值