java调用python算法
做项目的时候,尤其是java开发时,经常会遇到调用python算法的情况,本人最近在项目中遇到这样一个问题:网页前端设计了一个与用户聊天的对话窗口(类似qq聊天),主要目的是为用户解答一些常见的问题。我想了一下需要一些自然语言处理的技术,包括问题与答案的分词词性标注与向量化表示等内容。python来设计的话,非常方便,有很多支持机器学习及自然语言处理的工具包。这里就不详细的介绍这个算法流程了。一般这种项目叫做智能问答系统,后续统一称呼。
调用python时,遇到了大量的坑。这里主要做一些总结:
(1)JPython jar包方法。可以在java类中直接执行python语句。这种方法看起来很简单,但问题也会很大不支持import外部包。只有一些简单的python语句才会比较顺利的被调用和执行。so pass!
(2) 使用Runtime.getRuntime()执行脚本文件。这里展示一个自己实测能行的例子:
java代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;public class TestThree {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("java控制台输入问题:");String instr = scanner.next();//定义个获取结果的变量String result="";try {//调用python,其中字符串数组对应的是python,python文件路径,向python传递的参数String[] strs=new String[] {"python","E:\\Pythonfile\\FAQrobot.py",instr};//Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。//一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。// exec(String[] cmdarray) 在单独的进程中执行指定命令和变量。 Process pr = Runtime.getRuntime().exec(strs);//使用缓冲流接受程序返回的结果BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"GBK"));//注意格式//定义一个接受python程序处理的返回结果String line=" ";while((line=in.readLine())!=null) {//循环打印出运行的结果result+=line+"\n";}//关闭in资源in.close();pr.waitFor();}catch (Exception e) {e.printStackTrace();}System.out.println("\npython传来的结果:");//打印返回结果System.out.println(result);}}p
python部分:
import sys
import jieba#定义个函数式用于分词
def jiebaclearText(text):#定义一个空的列表,将去除的停用词的分词保存mywordList=[]#进行分词seg_list=jieba.cut(text,cut_all=False)#将一个generator的内容用/连接listStr='/'.join(seg_list)#对默认模式分词的进行遍历,去除停用词for myword in listStr.split('/'):mywordList.append(myword)return '/ '.join(mywordList)if __name__=="__main__":text=sys.argv[1]#获取系统传来的参数text1=jiebaclearText(text)print(text1)
该例子实现了java控制台输入文本句子,python算法接收传入并进行分词,返回给java控制器。此处python算法调用外部jieba中文处理工具。
(3)标准输入输出来调用python。这种方法是之前在做C# Windows Form程序时调用python的方法。就是开一个cmd 黑框来执行python算法。当时是那么做的,现在把这方法拿过来试了一下也可以用。具体情况可以搜索一下java cmd命令。下面是一个demo。
java部分:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;public class Main {public static void main(String args[]) throws InterruptedException {Runtime runtime = Runtime.getRuntime();String classPath=Main.class.getResource("").getPath().substring(1);try {Process cmd = runtime.exec("python "+classPath+"temp.py");BufferedWriter cmdInstream = new BufferedWriter(new OutputStreamWriter(cmd.getOutputStream(),"GBK"));BufferedReader cmdShowStream = new BufferedReader(new InputStreamReader(cmd.getInputStream(), "GBK"));BufferedReader cmdErrStream=new BufferedReader(new InputStreamReader(cmd.getErrorStream(),"GBK"));Scanner scanner = new Scanner(System.in);String instr = scanner.next();cmdInstream.write(instr+"aaaa\n");cmdInstream.flush(); String cmdOutStr;Thread.sleep(100);while(cmdShowStream.ready()){ System.out.println(cmdShowStream.readLine()); }while ((cmdOutStr = cmdErrStream.readLine()) != null) {System.out.println(cmdOutStr); }// String cmdOutStr = cmdShowStream.readLine();
// System.out.println(cmdOutStr);cmdInstream.write("exit\n");cmdInstream.flush();scanner.close();} catch (IOException e) {e.printStackTrace();}}
}
python部分:
import sys
while True:str = input("");if str=='exit':sys.exit()else:print("你输入了:",str)
这个demo实现了java控制台通过scanner输入到python,处理返回的过程。实测过程中坑还是比较多的。基本原理就是java与控制台交互,输入命令和读入cmd的输出信息(包括报错信息)。cmd方法需要注意的是,你要提前安好python配好环境变量,确保python在cmd中可执行。
java调用python算法相关推荐
- Spark Scala/Java调用Python算法文件
1.Windows本地调用 1.1python算法库环境安装 python算法中会调用许多额外的其它第三方库,使用pip install xxx安装时会经常因为一些原因(如网络延迟)导致安装失败,这时 ...
- 如何在Java程序中调用Python算法脚本,重点讲Demo,不墨迹理论
原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重. 前言 通过本篇,你将初步认识在Java程序中简单调用.py脚本文件的方法,附带入门的Demo实例讲解,更深入的理解还需要进一步学习. 最近 ...
- .net core 引用jar_Python一键转Jar包,Java调用Python新姿势!
粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 今天的这篇文章,聊一个轩辕君之前工作中遇到的需求:如何在Jav ...
- Java 调用 Python 方法学习笔记
文章转载自: 作者:IT_xiao_bai 来源:CSDN 原文:https://blog.csdn.n ...
- python文件转换成jar包_Python一键转Jar包,Java调用Python新姿势!
粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 今天的这篇文章,聊一个轩辕君之前工作中遇到的需求:如何在Jav ...
- java调用python文件的几种方式【超细讲解!】
java调用python的契机来自于一个项目需要用到算法,但是算法工程师们写的python,于是就有了java后端调用python脚本的需求,中间遇到了许多问题,特此记录整理了一次. 1.java调用 ...
- Java调用python脚本
Java调用python脚本 最近也是刚开始学python,所以这里写了一个简单的小方法用Java来调用python脚本.后期再进行更新. 1.Java启动程序的方法 在Java中提供了两种方法来启动 ...
- Java调用Python遇到的一系列问题与解决方案
Java调用Python遇到的一系列问题与解决方案 参考文章: (1)Java调用Python遇到的一系列问题与解决方案 (2)https://www.cnblogs.com/CQUTWH/p/593 ...
- java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...
java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...
最新文章
- MySQL基础:数据类型
- C/C++从源代码到生成可执行程序的过程详解!
- Linux编辑器vi使用方法详细介绍
- python sizeof函数_C++ sizeof 运算符 | 菜鸟教程
- 谈谈对搜索技术Elastic SearchLucene的理解
- DL之FastR-CNN:Fast R-CNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- [MEGA DEAL]完整的Java编程训练营(94%折扣)
- nginx文件系统大小_Nginx 了解一下?
- Java游戏有易筋经_易筋经- JavaWeb-1
- http协议中的响应代码从 1xx ~ 5xx,一共有41种
- 怎样才能办理信用卡成功?
- 每天一个linux命令(55)--at命令
- poj1113 凸包
- Atitit.mysql 5.0 5.5 5.6 5.7 新特性 新功能
- top res mysql_Java应用Top命令RES内存占用高分析
- 局域网部署文档协同办公系统:Windows + onlyoffice + dzzoffice
- keil5 下载器配置
- 计算机硬件系统实验教程代码,计算机硬件系统实验教程
- pip安装第三方库 报错:You should consider upgrading
- 交互设计|抖音为什么是上滑查看下一个视频