在java类中直接执行python语句

准备工作:

创建maven工程,结构如下:到官网https://www.jython.org/download.html下载Jython的jar包或者在maven的pom.xml文件中加入如下代码:

[plain] view plaincopy  
  1. <dependency>java  
  2.     <groupId>org.python</groupId>    <artifactId>jython-standalone</artifactId>    <version>2.7.0</version></dependency>  

创建JavaRunPython.java类:

[plain] view plaincopy  
  1. import org.python.util.PythonInterpreter;public class JavaRunPython {    public static void main(String[] args) {  
  2.         PythonInterpreter interpreter = new PythonInterpreter();  
  3.         interpreter.exec("a='hello world'; ");  
  4.         interpreter.exec("print a;");  
  5.     }  
  6.   
  7. }  

2.在java中直接调用python脚本

 

在本地的D盘创建一个python脚本,文件名字为javaPythonFile.py,文件内容如下:

[plain] view plaincopy  
  1. a = 1  
  2. b = 2  
  3. print (a + b)  

创建JavaPythonFile.java类,内容如下:

[plain] view plaincopy  
  1. import org.python.util.PythonInterpreter;public class JavaPythonFile {    public static void main(String[] args) {  
  2.         PythonInterpreter interpreter = new PythonInterpreter();  
  3.         interpreter.execfile("D:\\javaPythonFile.py");  
  4.     }  
  5. }  

输出结果如下:

在java类中直接执行python语句

注意:以上两个方法虽然都可以调用python程序,但是使用Jpython调用的python库不是很多,如果你用以上两个方法调用,而python的程序中使用到第三方库,这时就会报错java ImportError: No module named xxx。遇到这种情况推荐使用下面的方法,即可解决该问题。

3.使用Runtime.getRuntime()执行python脚本文件,推荐使用

 

为了验证该方法可以运行含有python第三方库的程序,在本地的D盘创建一个python脚本,文件名字为demo1.py,代码如下:

[plain] view plaincopy  
  1. import numpy as np  
  2.   
  3. a = np.arange(12).reshape(3,4)print(a)  

可以看到程序中用到了numpy第三方库,并初始化了一个3×4的一个矩阵。

下面来看看怎么用Runtime.getRuntime()方法来调用python程序并输出该结果,java代码如下:

[plain] view plaincopy  
  1. import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Demo1 {  
  2.     public static void main(String[] args) {  
  3.         // TODO Auto-generated method stub        Process proc;  
  4.         try {  
  5.             proc = Runtime.getRuntime().exec("python D:\\demo1.py");// 执行py文件            //用输入输出流来截取结果            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));  
  6.             String line = null;  
  7.             while ((line = in.readLine()) != null) {  
  8.                 System.out.println(line);  
  9.             }  
  10.             in.close();  
  11.             proc.waitFor();  
  12.         } catch (IOException e) {  
  13.             e.printStackTrace();  
  14.         } catch (InterruptedException e) {  
  15.             e.printStackTrace();  
  16.         }   
  17.     }  
  18. }  

输出的结果如下图所示:

在java类中直接执行python语句

可以看到运行成功了,但有的朋友可能会问了,怎么在python程序中函数传递参数并执行出结果,下面我就举一例来说明一下。

先写一个python的程序,代码如下:

[plain] view plaincopy  
  1. import sys  
  2.   
  3. def func(a,b):    return (a+b)if __name__ == '__main__':  
  4.     a = []  
  5.     for i in range(1, len(sys.argv)):  
  6.         a.append((int(sys.argv[i])))  
  7.   
  8.     print(func(a[0],a[1]))  

其中sys.argv用于获取参数url1,url2等。而sys.argv[0]代表python程序名,所以列表从1开始读取参数。

以上代码实现一个两个数做加法的程序,下面看看在java中怎么传递函数参数,代码如下:

[plain] view plaincopy  
  1. int a = 18;  
  2. int b = 23;try {  
  3.     String[] args1 = new String[] { "python", "D:\\demo2.py", String.valueOf(a), String.valueOf(b) };  
  4.     Process proc = Runtime.getRuntime().exec(args1);// 执行py文件    BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));  
  5.     String line = null;  
  6.     while ((line = in.readLine()) != null) {  
  7.         System.out.println(line);  
  8.     }  
  9.     in.close();  
  10.     proc.waitFor();  
  11. } catch (IOException e) {  
  12.     e.printStackTrace();  
  13. } catch (InterruptedException e) {  
  14.     e.printStackTrace();  
  15. }  

在java类中直接执行python语句

在来一个实战案例---模型获取相似关键词:

调用pyhon模型

java代码

[plain] view plaincopy  
  1. package com.hadoop.flowsum;/*作者     :XiangLin 
  2. 创建时间 :2020/10/26 9:55 
  3. 文件     :testpython.java 
  4. IDE      :IntelliJ IDEA 
  5. */import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public class Demo1 {  
  6.   
  7.     public static String getType(Object o){ //获取变bai量类型方法du        return o.getClass().toString(); //使用int类型的getClass()方法    }  
  8.   
  9.     public static void main(String[] args) throws IOException, InterruptedException {  
  10.         // TODO Auto-generated method stub        String cmds = String.format("python D:word2vec\\testsimilar.py %s","中国");  
  11.         Process pcs = Runtime.getRuntime().exec(cmds);  
  12.         pcs.waitFor();  
  13.   
  14.         BufferedReader in = new BufferedReader(new InputStreamReader(pcs.getInputStream(),"GB2312"));  
  15.   
  16.         Map<String, String> map = new HashMap<>();  
  17.         String line = null;//        System.out.println(in.readLine());        while ((line = in.readLine()) != null) {  
  18.             System.out.println(line);  
  19.             String[] s = line.split("\t");//            System.out.println(s[0]+s[1]);            map.put(s[0],s[1]);  
  20.         }//        System.out.println(in.readLine());        if (in.readLine() == null){  
  21.             System.out.println("yes hhhhhh");  
  22.         }//        String key1 = (String) map.keySet().toArray()[0];        String key1 = (String) map.keySet().toArray()[0];  
  23.         String d1 = map.get(key1);  
  24.         double xx = Double.parseDouble(d1);//        System.out.println(getType(xx));//        if (xx > 0.6){//            System.out.println("nice   ................");//        }    }  
  25. }  

python代码:

[plain] view plaincopy  
  1. # * coding:utf-8_*_# 作者     :XiangLin# 创建时间 :2020/10/26 9:14# 文件     :testsimilar.py# IDE      :PyCharmimport osimport timeimport warningsimport sys# import config# import loggingfrom gensim.models import Word2Vec# from gensim.models.word2vec import LineSentence, PathLineSentences# from pretreatment.pretreatment import PreDealwarnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')  
  2. model = Word2Vec.load(r"D:\\model\\word2vec.model")def similarwords(keyword, tops=5):    # 默认获取前10个相似关键词    start = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))  
  3.     # print("start execute Word2vec, get similar keywords! Time:" + start +">>>>>>>>>>>>>>>>>>>>>")    try:  
  4.         # model = Word2Vec.load(modelpath)        words = model.wv.most_similar(keyword, topn=tops)  
  5.     except KeyError:  
  6.         # print("word '%s' not in vocabulary" % keyword)        return None    end = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))  
  7.     if not words:  
  8.         return None        # res = [[item[0], item[1]] for item in words]   # 相似关键词及其相似度    res = []  
  9.     for word in words:  
  10.         res.append([word[0], word[1]])  
  11.         print(word[0], "\t", word[1])  
  12.     # print("get similar keywords end!................... Time:" + end + ">>>>>>>>>>>>>>>>>>>>>")    # print(res)    return resif __name__ == '__main__':  
  13.     word = sys.argv[1];  
  14.     similarwords(word)  

输出:

在java类中直接执行python语句

最后

感谢大家看到这里,文章有不足,欢迎大家指出;如果你觉得写得不错,那就给我一个赞吧

上一篇:C#网页 截图


下一篇:python实现刷网页小程序