Java Runtime() 调用python,python进程刚运行就闪退,以及运行之后进程不关闭且不返回的问题

Lacie ·
更新时间:2024-11-14
· 943 次阅读

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 关注 私信 展开阅读全文
作者:qq_fzx



用python JAVA 运行 关闭 runtime Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号