Java调用Python的4中方法
1在java类中直接执行python语句
2在java类中直接调用本地python脚本
3使用Runtime.getRuntime()执行python脚本文件(推荐)
4调用python脚本中的函数
下面我们介绍第三种方法
Runtime.getRuntime()
Java端
public static void main(String[] args) throws IOException, InterruptedException {
String exe = "C:\\xxxxxx\\python.exe";
String command = "F:\\xxxxxxxx\\test.py";
String url="C:\\xxxxxxxx\\R-C.jpg";
String[] cmdArr = new String[] {exe, command,url};
Process process = Runtime.getRuntime().exec(cmdArr);
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
坑1:String exe 一定要是自己电脑的python路径,否则可能会解析出null。
Python端
这是自己写的第一个机器学习的人脸识别情绪的模型调用预测代码。
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
坑2:model的调用,不能采用相对路径,一定要是绝对路径,否则因为是java调用python,所以会找不到机器学习模型加载。
坑3
坑3:java调用python输出会出现中文乱码的情况
网上有许多解决方案,包括修改java端的编码为utf-8还有修改python端的编码为utf-8等但都不管用。
原因
这是因为python中print函数的机制问题。 他的默认编码格式是(‘zh_CN’, ‘cp936’),而cp36 就是编码GB2312。 知道问题所在后我们就可以解决了。
解决方案1(Java端修改)
我采用的是Process方式。因此需要在java端将输入流的字符编码设置成Gb2312
BufferedReader in =
new BufferedReader(new InputStreamReader(process.getInputStream(),"gb2312");
解决方案2(python端修改)
如果调用方式不一样的话,就可以采用在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')
|