这里是java 利用Runtime.getRuntime().exec()调用python所遇见的问题
上代码:利用java的这部分代码去调用python代码
public List<String> recommend(String job_exp,String job_edu,String job_loc,String job_info) {
try {
String[] args = new String[] { "python", "C:\\xxx\\job_recommend\\src\\main\\web\\python\\w2v_recommedn.py", job_info, job_edu,job_exp,job_loc };
Process proc = Runtime.getRuntime().exec(args);// 执行py文件
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(),"GBK"));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
List<String> strsToList2=new ArrayList<>();
Collections.addAll(strsToList2,line);
System.out.println(strsToList2);
return strsToList2;
}
in.close();
proc.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
python部分:w2v_recommedn.py
def final_return(user_input,edu,exp,loc):
return_json={"name":"","des":"","symbolSize": 70,"category": 1,}
final_list=[]
r_list=recommend_list(user_input, edu, exp, loc)
for i in r_list:
return_json["name"]=i[0]
des=str(i[1])+"<br>"+str(i[2])+"<br>"+str(i[3])
# des_list=re.split(r"[0-9]\.|[0-9]、|[0-9][)]",i[4])
jobinfo=""
# if len(des_list)<1:#如果不能按照数字匹配,则按照字符串长度切割
des_list=cut(i[4],40)
for k in des_list:
jobinfo = jobinfo + k + "<br>"
# else:
# for j in des_list:
# jobinfo=jobinfo+j+"<br>"
des=des+jobinfo
# print(des_list)
return_json["des"]=des
final_list.append(return_json)
java_list=""# 这么多一步是为了让python的列表 变成Java的列表
for i in final_list:
java_list=java_list+str(i)+','
return java_list
if __name__ == '__main__':
job_info = sys.argv[1]
job_edu = sys.argv[2]
job_exp = sys.argv[3]
job_loc = sys.argv[4]
print(final_return(job_info,job_edu,job_exp,job_loc))
发现python的资源占用率在很高几秒之后迅速下降为0。
原因:最终是因为被调用的python文件里的包会不断的在控制台输出警告日志。而java正是通过控制台截取输出从而获得python的数据,所以java截取部分警告日志后便不再调用python。
解决办法:修改python文件中引入包的logging输出,使其不在控制台输出即可。