1.python刚运行就闪退
问题分析:因为java调用python是把它运行在java 运行时中,所以如果python中使用相对路径的话会报错,但是这个报错不会被抛出,所以就有了闪退的现象。
解决方法:python中的路径全部用绝对路径
2.python进程运行之后不关闭,资源占用为0且迟迟没有返回值。
问题分析:这是因为进程中调用的包会输出一些东西,然后塞满运行窗口的标准输出缓冲区
解决方法:创建一个线程,清空缓冲区
File dir = new File("C:\\数据存储\\xxx\\job_recommend\\src\\main\\web\\python");
String[] envp = new String[] {"path=C:\\Users\\xx\Anaconda3\\envs\\py36"};
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,envp,dir);// 执行py文件
final InputStream is1 = proc.getInputStream();
new Thread(new Runnable() {
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(is1));
try{
while(br.readLine() != null) ;
}
catch(Exception e) {
e.printStackTrace();
}
}
}).start(); // 启动单独的线程来清空p.getInputStream()的缓冲区
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(),"GBK"));
StringBuilder buf = new StringBuilder(); // 保存python的输出结果流
String line = null;
String regex = "(\\{(.*?)})";
while ((line = in.readLine()) != null) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(line);
List list=new ArrayList();
while (matcher.find()) {
System.out.println(matcher.group(1));
list.add(matcher.group(1));
}
System.out.println(list);
参考:Java中Process和Runtime()使用,以及调用cmd命令阻塞在process.waitfor( )的问题解决
qq_fzx 原创文章 4获赞 1访问量 921 关注 私信 展开阅读全文