Java調(diào)用python代碼的五種方式總結(jié)
前言
你還在糾結(jié)怎么樣在Java中調(diào)用python嗎?我們?cè)趯?shí)際工程項(xiàng)目問(wèn)題中,經(jīng)常會(huì)碰到不同語(yǔ)言代碼之間互調(diào)的問(wèn)題,比如此處的Java調(diào)用python(常見(jiàn)Java調(diào)用python寫(xiě)的處理模型來(lái)完成數(shù)據(jù)處理等)。
讓我們來(lái)看看具體怎么操作吧!
1. 無(wú)參數(shù)調(diào)用
說(shuō)明: Java調(diào)用不帶參數(shù)的python代碼執(zhí)行
樣例代碼如下:
try { String exe = "python解釋器所處的絕對(duì)路徑"; String py = "python代碼文件絕對(duì)地址"; Process process = Runtime.getRuntime().exec(exe + " " + py); //獲取結(jié)果的同時(shí)設(shè)置輸入流編碼格式"gb2312" InputStreamReader isr = new InputStreamReader(process.getInputStream(),"gb2312"); LineNumberReader input = new LineNumberReader(isr); String result = ""; result = input.readLine(); System.out.println(result); input.close(); isr.close(); process.waitFor(); } catch (InterruptedException | IOException e) { System.out.println("調(diào)用python腳本并讀取結(jié)果時(shí)出錯(cuò):" + e.getMessage()); }
2. 帶參數(shù)調(diào)用
帶參調(diào)用可以將命令和參數(shù)寫(xiě)入String數(shù)組,然后作為執(zhí)行參數(shù)執(zhí)行。
基本語(yǔ)句如下:
String exe = "python解釋器所處的絕對(duì)路徑"; String py = "python代碼文件絕對(duì)地址"; String pram = "單個(gè)傳遞參數(shù),若參數(shù)為基本類(lèi)型,轉(zhuǎn)化為String;若為數(shù)組等類(lèi)型,也是將其轉(zhuǎn)換為String型"; String [] args = new String[] {exe, py, pram...}; Process process = Runtime.getRuntime().exec(args);
2.1. 單行返回值
說(shuō)明: Java調(diào)用不帶參數(shù)的python代碼執(zhí)行
樣例代碼如下:
try { String exe = "python解釋器所處的絕對(duì)路徑"; String py = "python代碼文件絕對(duì)地址"; String pram = "單個(gè)傳遞參數(shù),若參數(shù)為基本類(lèi)型,轉(zhuǎn)化為String;若為數(shù)組等類(lèi)型,也是將其轉(zhuǎn)換為String型"; String [] args = new String[] {exe, py, pram...}; Process process = Runtime.getRuntime().exec(args); //獲取結(jié)果的同時(shí)設(shè)置輸入流編碼格式"gb2312" InputStreamReader isr = new InputStreamReader(process.getInputStream(),"gb2312"); LineNumberReader input = new LineNumberReader(isr); String result = ""; result = input.readLine(); System.out.println(result); input.close(); isr.close(); process.waitFor(); } catch (InterruptedException | IOException e) { System.out.println("調(diào)用python腳本并讀取結(jié)果時(shí)出錯(cuò):" + e.getMessage()); }
2.2. 多行返回值
說(shuō)明: Java調(diào)用不帶參數(shù)的python代碼執(zhí)行
樣例代碼如下:
try { String exe = "python解釋器所處的絕對(duì)路徑"; String py = "python代碼文件絕對(duì)地址"; String pram = "單個(gè)傳遞參數(shù),若參數(shù)為基本類(lèi)型,轉(zhuǎn)化為String;若為數(shù)組等類(lèi)型,也是將其轉(zhuǎn)換為String型"; String [] args = new String[] {exe, py, pram...}; ProcessBuilder builder = new ProcessBuilder(args); Process process = builder.start(); BufferedReader success = new BufferedReader(new InputStreamReader(process.getInputStream(), "GB2312"));//獲取字符輸入流對(duì)象 BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream(), "GB2312"));//獲取錯(cuò)誤信息的字符輸入流對(duì)象 String line = null; List<String> success_result = new ArrayList<>(); List<String> error_result = new ArrayList<>(); //記錄輸出結(jié)果 while ((line = success.readLine()) != null) { success_result.add(line); } //記錄錯(cuò)誤信息 while ((line = error.readLine()) != null) { error_result.add(line); } success.close(); error.close(); process.waitFor(); System.out.println(success_result); System.out.println(error_result); } catch (InterruptedException | IOException e) { System.out.println("調(diào)用python腳本并讀取結(jié)果時(shí)出錯(cuò):" + e.getMessage()); }
3. Java中直接執(zhí)行python語(yǔ)句
注意: 此方法在使用之前需要導(dǎo)入依賴環(huán)境,如在maven中導(dǎo)入如下依賴:
<dependency> <groupId>org.python</groupId> <artifactId>jython-standalone</artifactId> <!--python版本在這里指定(2.x或3.x等)--> <version>3.7.0</version> </dependency>
調(diào)用語(yǔ)句如下:
import org.python.util.PythonInterpreter public class JavaRunPython { public static void main(String[] args) { //調(diào)用python的解釋器 PythonInterpreter interpreter = new PythonInterpreter(); //執(zhí)行Python語(yǔ)句 interpreter.exec("str = 'hello world!'; "); interpreter.exec("print(str);"); } }
4. 通過(guò)PythonInterpreter直接調(diào)用python腳本
注意: 此方法也需要導(dǎo)入1.3中依賴
Java調(diào)用代碼如下:
import org.python.util.PythonInterpreter; public class JavaPythonFile { public static void main(String[] args) { PythonInterpreter interpreter = new PythonInterpreter(); //我在這里使用相對(duì)路徑,注意區(qū)分 interpreter.execfile("D:/code/test.py"); } }
test.py舉例如下:
a = 1 b = 2 print(a +b)
5. Java通過(guò)調(diào)用bat文件間接調(diào)用python
hello.bat測(cè)試代碼如下:
echo hello world! D: cd D:\code\ start python test.py pause
Java調(diào)用代碼如下:
try { StringBuilder sb = new StringBuilder(); String batPath = "D:/hello.bat"; Process process = Runtime.getRuntime().exec(batPath); InputStream in = process.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in)); String line; while ((line = bufferedReader.readLine()) != null) { sb.append(line + "\n"); } in.close(); try { process.waitFor(); } catch (InterruptedException e) { System.out.println(e); } } catch (IOException e) { System.out.println(e); }
總結(jié)
到此這篇關(guān)于Java調(diào)用python代碼的五種方式的文章就介紹到這了,更多相關(guān)Java調(diào)用python代碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JDK動(dòng)態(tài)代理提高代碼可維護(hù)性和復(fù)用性利器
這篇文章主要為大家介紹了JDK動(dòng)態(tài)代理提高代碼可維護(hù)性和復(fù)用性利器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10easycode配置成mybatis-plus模板的實(shí)現(xiàn)方法
本文主要介紹了easycode配置成mybatis-plus模板的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09OpenFeign實(shí)現(xiàn)微服務(wù)間的文件下載方式
這篇文章主要介紹了OpenFeign實(shí)現(xiàn)微服務(wù)間的文件下載方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05在mybatis中使用mapper進(jìn)行if條件判斷
這篇文章主要介紹了在mybatis中使用mapper進(jìn)行if條件判斷,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01解決2022.3.1版本中?IDEA中?XML文件提示屎黃色背景的方法
這篇文章主要介紹了解決2022.3.1版本中?IDEA中?XML文件屎黃色背景?的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01java使用poi讀取doc和docx文件的實(shí)現(xiàn)示例
這篇文章主要介紹了java使用poi讀取doc和docx文件的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Spring Cloud入門(mén)教程之Zuul實(shí)現(xiàn)API網(wǎng)關(guān)與請(qǐng)求過(guò)濾
這篇文章主要給大家介紹了關(guān)于Spring Cloud入門(mén)教程之Zuul實(shí)現(xiàn)API網(wǎng)關(guān)與請(qǐng)求過(guò)濾的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-05-05Maven打包jar包沒(méi)有主屬性問(wèn)題解決方案
這篇文章主要介紹了Maven打包jar包沒(méi)有主屬性問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07xxl-job對(duì)比ElasticJob使用示例詳解
這篇文章主要為大家介紹了xxl-job對(duì)比ElasticJob使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Springboot工程中使用filter過(guò)程解析
這篇文章主要介紹了springboot工程中使用filter過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03