跳了N个坑又爬出来的Python调用JAVA传参收参(多图详细指导!)

做为一个几乎没用过java的深度学习相关人员,在进行Python调用Java时,进入了n个深坑。在过去的1周里,头发少了很多。(在打这句话的时候,又发现桌子上的一根头发。。。)
把我能想到的方法发出来,给大家些启发,如果有更方便稳定的方法请一定告诉我。谢谢


话不多说

首先说一个前提,如果只是想向一个java程序传递若干个参数,然后收到java运算后的结果,那么本文的方法会非常简单实用(因为复杂的方法的坑我已经跳过了)。如果是比较复杂的情况,请安装jpype,安装方法可以看我的另外一篇博客。

进入正题

首先,请确定你的java JDK的版本,如果要在服务器上做工程,也请确定服务器上JKD的版本。在ide中编译的环境要于最终java运行的环境的jdk一致,否则会出现这种问题:

Exception in thread “main” java.lang.UnsupportedClassVersionError: Unsupported major.minor version 52.0

跳了N个坑又爬出来的Python调用JAVA传参收参(多图详细指导!)

这个百度下就知道是版本不一致的问题,mac用户这个时候就百度下安装一个合适版本的jdk,win用户就比较简单了。
版本在cmd/terminal

java -version

就行了,看一下你的目标版本

先说下原理思路

思路就是python运行一个脚本,在shell里调用java程序,并且传递参数,然后读取java运行后的结果

JAVA部分

首先我们要在main函数里,设定外部传入的数据,可以在main中添加:


    public static void main(String[] args) {
        String data0= args[0];
        String data1 = args[1];
        xxxxxxx(data0,data1);
    }

data0和data1就是我们要传入的数据,xxxx就是需要这2个参数的 函数,看着改吧。

改好.java文件以后,我们就进行打包打成jar包的环节
很简单,大家不要出错,出错会很麻烦

1

跳了N个坑又爬出来的Python调用JAVA传参收参(多图详细指导!)
File

2

跳了N个坑又爬出来的Python调用JAVA传参收参(多图详细指导!)

project structure

3

跳了N个坑又爬出来的Python调用JAVA传参收参(多图详细指导!)
artifact 加号
跳了N个坑又爬出来的Python调用JAVA传参收参(多图详细指导!)
不要选empty选下面那个~~~·
跳了N个坑又爬出来的Python调用JAVA传参收参(多图详细指导!)

选择你的主类,一定要选哦~

最后别忘了把你的lib都include进去,就是吧include in project build勾选上

okJAVA部分要结束了

build一下,在Artfact那个界面里,把地址记录一下
跳了N个坑又爬出来的Python调用JAVA传参收参(多图详细指导!)
就是那个output地址,去那里把我们打好的jar包拿到吧~哈哈哈,结束一大半了~

Python部分

Python部分的核心在于os.popen这个指令
原理就是用python在cmd里运行

java -jar jar.jar

这个指令

然后加上你要传递的参数

java -jar jar.jar arg0 arg1

注意这个部分arg0和arg1中间要有个空格,然后从cmd里拿出运行的结果

相信看这个文章的主要是python用的多的人,我就简短点。
大家可以选择自己的方法,大家*发挥。
因为我这个方法的缺点就是popen这个函数是buff上线的,我测试传递一个base64的东东的时候,就无法传递。。。。

command = "java -jar test.jar"
arg0 = "/Users/documents/lilili.jpg"
arg1 = "/Users/documents/lalala.jpg"
cmd = [command,arg0,arg1]
new_cmd = " ".join(cmd)
f = os.popen(new_cmd)
d = f.read()
print(d)
print(type(d))
f.close()

最后JAVA的输出就会保存在这个d里~
记得要import os哦~
跳了N个坑又爬出来的Python调用JAVA传参收参(多图详细指导!)

ok

差不多就是这样了~
要是有小伙伴知道如果能够简单的传递base64这种比较长的参数的方法,请一定要告诉我哦~