java调用python的踩坑之路
1.前言介绍
最近有一个需求,让在java程序中调用python,二话不说,拿起键盘一把嗦。踩过了不少坑,在这里分享一下。最后会有调用示例代码。
2.调用方法
1.采用org.python包(maven添加依赖),可以在java中直接写代码,也可以使用包封装的方法调用python代码,但Jpython从2015年就不更新了,而且Jpython对python的第三方库支持的不多。
2.Java应用调用外部命令启动一些新进程来执行一些文件,这里就用到了Runtime.getRuntime().exec(),也可以传参数,对python的第三库的支持,只要本地python下载了第三库即可。
3.踩坑之路
1.现在有许多开源的Python发行版本,比如Anaconda ,Miniconda,因为我之前安装过Anaconda ,也在python官网上下载了python,所以本机上有两个python.exe执行文件,所以本机无法识别要用那个,就会报错找不到文件,实际上是python.exe的问题。所以我就卸载了Anaconda 。有人会问了,为什么不卸载python呢,因为我Anaconda 没有配置环境变量,所以不能再dos命令下执行python命令。
2.在dos命令下输入python,有反应了,ok,这样就可以使用python命令了。注意python2.7以后,安装python的时候,可以选择自动添加环境变量。
3.再次运行文件,没有报错,但是没有执行结果。原来是本地没有引入python代码中用到的第三方库。那就去安装第三方库吧,以numpy为例,输入命令 pip install numpy ,出现两行黄字,意思就是当前pip版本太低,需要更新,那就更新,
python -m pip install --upgrade pip
4.执行了好几次上面的命令,总是失败,原来是国际镜像的问题,那就用国内的镜像吧,
python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple ,ok 这样就很快了。下载更新成功,再去安装其他的第三方库。
4.代码
代码是参考他人的,我看网上的博客的代码几乎都是一样的,也不知道哪个是第一个了。在这里,谢谢代码提供者了。
#coding:utf-8
import pandas as pd
import numpy as np
import sklearn
import sys
def Add(a,b):
sum = a + b
print(sum)
if __name__ == "__main__":
a = []
for i in range(1, len(sys.argv)):
a.append(sys.argv[i])
Add(a[0],a[1])
这是一个需要传参的python文件
public void testpython(){
int a = 18;
int b = 23;
try {
String[] args = new String[] { "python", "D:\\test.py", String.valueOf(a), String.valueOf(b) };
Process proc = Runtime.getRuntime().exec(args1);// 执行py文件
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
proc.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
第5行代码, 数组[1]是python文件的绝对路径。