赞
踩
1在java类中直接执行python语句
2在java类中直接调用本地python脚本
3使用Runtime.getRuntime()执行python脚本文件(推荐)
4调用python脚本中的函数
下面我们介绍第三种方法
public static void main(String[] args) throws IOException, InterruptedException {
String exe = "C:\\xxxxxx\\python.exe";//调用自己的python路径
String command = "F:\\xxxxxxxx\\test.py";//要调用的python函数脚本
String url="C:\\xxxxxxxx\\R-C.jpg";//传递的参数可以多个,python端取就可以
String[] cmdArr = new String[] {exe, command,url};//将参数封装
Process process = Runtime.getRuntime().exec(cmdArr);//采用Process调用
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));//用输入流读取
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);//输出调用结果
}
in.close();
process.waitFor();
}
坑1:String exe 一定要是自己电脑的python路径,否则可能会解析出null。
这是自己写的第一个机器学习的人脸识别情绪的模型调用预测代码。
emotion_dict = {'生气': 0, '悲伤': 5, '中性': 4, '厌恶': 1, '惊讶': 6, '恐惧': 2, '高兴': 3} # 载入图像 url = argv[1]//传递的第一个参数 image = face_recognition.load_image_file(url) face_locations = face_recognition.face_locations(image) top, right, bottom, left = face_locations[0] face_image = image[top:bottom, left:right] face_image = cv2.resize(face_image, (48, 48)) face_image = cv2.cvtColor(face_image, cv2.COLOR_BGR2GRAY) face_image = np.reshape(face_image, [1, face_image.shape[0], face_image.shape[1], 1]) model = load_model("F:\\xxxxxxx\\model_v6_23.hdf5")//调用模型 predicted_class = np.argmax(model.predict(face_image)) label_map = dict((v, k) for k, v in emotion_dict.items()) predicted_label = label_map[predicted_class] # print(type(predicted_label)) print(predicted_label)
坑2:model的调用,不能采用相对路径,一定要是绝对路径,否则因为是java调用python,所以会找不到机器学习模型加载。
坑3:java调用python输出会出现中文乱码的情况
网上有许多解决方案,包括修改java端的编码为utf-8还有修改python端的编码为utf-8等但都不管用。
这是因为python中print函数的机制问题。
他的默认编码格式是(‘zh_CN’, ‘cp936’),而cp36
就是编码GB2312。
知道问题所在后我们就可以解决了。
我采用的是Process方式。因此需要在java端将输入流的字符编码设置成Gb2312
BufferedReader in =
new BufferedReader(new InputStreamReader(process.getInputStream(),"gb2312");
如果调用方式不一样的话,就可以采用在python端修改,修改他的输出编码格式。
(在文件头添加)
import io
import sys
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。