java調用python的幾種用法(看這篇就夠了)html
在java類中直接執行python語句
準備工做:java
建立maven工程,結構以下:到官網https://www.jython.org/download.html
下載Jython的jar包或者在maven的pom.xml文件中加入以下代碼:python
<dependency>java
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.0</version>
</dependency>
建立JavaRunPython.java類:程序員
import org.python.util.PythonInterpreter;
public class JavaRunPython {
public static void main(String[] args) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("a='hello world'; ");
interpreter.exec("print a;");
}
}
2.在java中直接調用python腳本
在本地的D盤建立一個python腳本,文件名字爲javaPythonFile.py,文件內容以下:web
a = 1
b = 2
print (a + b)
建立JavaPythonFile.java類,內容以下:微信
import org.python.util.PythonInterpreter;
public class JavaPythonFile {
public static void main(String[] args) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("D:\\javaPythonFile.py");
}
}
輸出結果以下:
app
注意:以上兩個方法雖然均可以調用python程序,可是使用Jpython調用的python庫不是不少,若是你用以上兩個方法調用,而python的程序中使用到第三方庫,這時就會報錯java ImportError: No module named xxx。遇到這種狀況推薦使用下面的方法,便可解決該問題。maven
3.使用Runtime.getRuntime()執行python腳本文件,推薦使用
爲了驗證該方法能夠運行含有python第三方庫的程序,在本地的D盤建立一個python腳本,文件名字爲demo1.py,代碼以下:編輯器
import numpy as np
a = np.arange(12).reshape(3,4)
print(a)
能夠看到程序中用到了numpy第三方庫,並初始化了一個3×4的一個矩陣。函數
下面來看看怎麼用Runtime.getRuntime()方法來調用python程序並輸出該結果,java代碼以下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Process proc;
try {
proc = Runtime.getRuntime().exec("python D:\\demo1.py");// 執行py文件
//用輸入輸出流來截取結果
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
proc.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
輸出的結果以下圖所示:
能夠看到運行成功了,但有的朋友可能會問了,怎麼在python程序中函數傳遞參數並執行出結果,下面我就舉一例來講明一下。
先寫一個python的程序,代碼以下:
import sys
def func(a,b):
return (a+b)
if __name__ == '__main__':
a = []
for i in range(1, len(sys.argv)):
a.append((int(sys.argv[i])))
print(func(a[0],a[1]))
其中sys.argv用於獲取參數url1,url2等。而sys.argv[0]表明python程序名,因此列表從1開始讀取參數。
以上代碼實現一個兩個數作加法的程序,下面看看在java中怎麼傳遞函數參數,代碼以下:
int a = 18;
int b = 23;
try {
String[] args1 = new String[] { "python", "D:\\demo2.py", String.valueOf(a), String.valueOf(b) };
Process proc = Runtime.getRuntime().exec(args1);// 執行py文件
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
proc.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
在來一個實戰案例---模型獲取類似關鍵詞:
調用pyhon模型
java代碼
package com.hadoop.flowsum;/*做者 :XiangLin
建立時間 :2020/10/26 9:55
文件 :testpython.java
IDE :IntelliJ IDEA
*/
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 {
public static String getType(Object o){ //獲取變bai量類型方法du
return o.getClass().toString(); //使用int類型的getClass()方法
}
public static void main(String[] args) throws IOException, InterruptedException {
// TODO Auto-generated method stub
String cmds = String.format("python D:word2vec\\testsimilar.py %s","中國");
Process pcs = Runtime.getRuntime().exec(cmds);
pcs.waitFor();
BufferedReader in = new BufferedReader(new InputStreamReader(pcs.getInputStream(),"GB2312"));
Map<String, String> map = new HashMap<>();
String line = null;
// System.out.println(in.readLine());
while ((line = in.readLine()) != null) {
System.out.println(line);
String[] s = line.split("\t");
// System.out.println(s[0]+s[1]);
map.put(s[0],s[1]);
}
// System.out.println(in.readLine());
if (in.readLine() == null){
System.out.println("yes hhhhhh");
}
// String key1 = (String) map.keySet().toArray()[0];
String key1 = (String) map.keySet().toArray()[0];
String d1 = map.get(key1);
double xx = Double.parseDouble(d1);
// System.out.println(getType(xx));
// if (xx > 0.6){
// System.out.println("nice ................");
// }
}
}
python代碼:
# * coding:utf-8_*_
# 做者 :XiangLin
# 建立時間 :2020/10/26 9:14
# 文件 :testsimilar.py
# IDE :PyCharm
import os
import time
import warnings
import sys
# import config
# import logging
from gensim.models import Word2Vec
# from gensim.models.word2vec import LineSentence, PathLineSentences
# from pretreatment.pretreatment import PreDeal
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')
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()))
# print("start execute Word2vec, get similar keywords! Time:" + start +">>>>>>>>>>>>>>>>>>>>>")
try:
# model = Word2Vec.load(modelpath)
words = model.wv.most_similar(keyword, topn=tops)
except KeyError:
# print("word '%s' not in vocabulary" % keyword)
return None
end = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
if not words:
return None
# res = [[item[0], item[1]] for item in words] # 類似關鍵詞及其類似度
res = []
for word in words:
res.append([word[0], word[1]])
print(word[0], "\t", word[1])
# print("get similar keywords end!................... Time:" + end + ">>>>>>>>>>>>>>>>>>>>>")
# print(res)
return res
if __name__ == '__main__':
word = sys.argv[1];
similarwords(word)
輸出:
上面設計的模型等資料,請你們添加向同窗微信,我來親自奉上。
END
本文分享自微信公衆號 - 五角錢的程序員(xianglin965)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。