java如何调⽤Python⽂件包括传参
最近在和我的⼩伙伴们做⼀个物体识别的⼩程序,主要是他通过深度学习,然后训练出了⼀个模型,只要向模型传图⽚的路径,即可得到识别的结果,
然后我主要负责做服务器和通过java调⽤他的模型,简单的说就是在java环境下调⽤Python脚本,
主要有两个⽅式
第⼀个是通过jython,这个⽅法不太好⽤,当Python⽤到第三⽅库的时候,由于jython不可能涵盖所有python第三⽅类库,
所以建议⽤第⼆种Runtime()开启进程来执⾏python脚本⽂件
String[] arguments = new String[] {"python","D:\\ccc\\1.py",str};//指定命令、路径、传递的参数
try {
Writer out = Writer(); //获得HttpServletResponse输出流对象
Process process = Runtime().exec(arguments);//开启进程来执⾏脚本⽂件
BufferedReader in = new BufferedReader(new InputStream()));//获取字符输⼊流对象
String line = null;
while ((line = in.readLine()) != null) {
JSONArray Resulet = JSONArray.fromObject(util.String()));//读取到结果(⼀⾏⽂字)进⾏数据处理
String json = String();
out.write(json);//使⽤输出流对象向⼩程序发送字符数据
}
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
第⼀⾏代码传递的参数str就是图⽚的路径(我这实例代码只传递⼀个参数,如果传递多个参数直接在str,后⾯加,格式都是⼀样,Python代码接收参数也是不⼀样,接着往下看),剩下的代码我都上了注释
dels import load_model
import numpy as np
from keras.preprocessing import image
import sys
import re
def predict(pic_dir):
model = load_model("D:/ccc/model.h5")
images = image.load_img(pic_dir, target_size=(32,32))
images = image.img_to_array(images)
images = np.expand_dims(images, axis=0)
images=np.array(images,dtype=int)
images_normalize=images.astype("float32")/255.0
pre_y=model.predict(images_normalize)
pre_y=shape(-1)
np.set_printoptions(suppress=False)
pre_y=[pre_y[i]*100 for i in range(len(pre_y))]
pre_y=[str(pre_y[i]) for i in range(len(pre_y))]
for i in range(len(pre_y)):
if pre_y[i].find('e',0,len(pre_y[i]))!=-1:
wei=int(pre_y[i][len(pre_y[i])-1])-1
pre_y[i]=re.sub(r'e-.*$','',pre_y[i])
pre_y[i]=re.sub(r'[^0-9]','',pre_y[i])
for j in range(0,wei):
pre_y[i]='0'+pre_y[i]
pre_y[i]='0'+'.'+pre_y[i]
pre_y=[pre_y[i]+"%" for i in range(len(pre_y))]
return pre_y
prediction=predict(sys.argv[1])
print(prediction)
上⾯是Python代码,prediction=predict(sys.argv[1])代码⾥⾯的sys.argv[1]就是接收传递过来的参数str,如果多个参数就以此类推接收
⼩程序接收到数据并输出到控制台
然后就是显⽰数据,给我⼩伙伴的深度学习点个赞!准确率还是挺⾼的
补充:Java调⽤Python⽂件
有时候我们想要通过java调⽤⼀个python⽂件,⽽这个python⽂件⼜必须在特定的virtualenv虚拟环境下才能运⾏。如果直接将这个python⽂件所需要的包安装到python系统环境下难免有些暴⼒
我想到了如下⽅法解决这个问题:
创建虚拟环境后,如果虚拟环境的⽂件夹叫做env,我们平时激活虚拟环境的命令是 source env/bin/activate 。在bin⽬录中还有⼀个⽂件叫做activate_this.py,我们通过这个⽂件切换到虚拟环境,在⼀个python⽂件(假设叫a.py)中调⽤该⽂件(activate_this.py),再书写想要调⽤的⽬标python⽂件,再由Java调⽤a.py即可完成指定虚拟环境下的python⽂件调⽤。
python⽂件名为a.py,代码如下
import os
activate_this = 'path/to/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
os.system("python target.py")
java代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args) {
try {
System.out.println("start");
Process pr = Runtime().exec("python /home/kui/桌⾯/a.py");
BufferedReader in = new BufferedReader(new InputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
python怎么读取json文件pr.waitFor();
System.out.println("end");
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。如有错误或未考虑完全的地⽅,望不吝赐教。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论