Linux環(huán)境下Java調(diào)用Python腳本的常見問題解決
基本操作
1. 基本命令
首先在Linux系統(tǒng)下,使用Java調(diào)用Python腳本,傳入?yún)?shù),需要使用Runtime.exec()方法,即在java中使用shell命令,這個(gè)方法有兩種使用形式:
- 無參數(shù)傳入,直接執(zhí)行Linux相關(guān)命令:Process pr = Runtime.getRuntime().exec(String cmd);
- 有參數(shù)傳入,并執(zhí)行Linux命令:Process pr = Runtime.getRuntime().exec(String[] cmd);
- 無參數(shù)可以直接傳入字符串,如果需要傳參數(shù),就要用2的字符串?dāng)?shù)組實(shí)現(xiàn)。
2. 執(zhí)行結(jié)果
使用exec方法執(zhí)行命令,如果需要執(zhí)行的結(jié)果,用如下方式得到:
String line; while ((line = input.readLine()) != null) { System.out.println(line); if ("".equals(line)) { break; } } System.out.println("line------------------>" + line);
3. 查看運(yùn)行錯(cuò)誤信息
可以用以下方式查看運(yùn)行的錯(cuò)誤信息:
BufferedReader errorResultReader = new BufferedReader(new InputStreamReader(pr.getErrorStream())); String errorLine; while ((errorLine = shellErrorResultReader.readLine()) != null) { System.out.println("errorStream:" + errorLine); } int exitCode = pr.waitFor(); System.out.println("exitCode:" + exitCode);
4. 簡單示例
當(dāng)然exec還有很多本文未說明的方法,本文目前只需要以上幾個(gè)方法進(jìn)行定位,尤其是3。
舉一個(gè)簡單的例子,使用Java調(diào)用Linux的pwd命令,得到當(dāng)前所在目錄:
String result = ""; String cmd = "pwd"; Process pr = Runtime.getRuntime().exec(cmd); InputStreamReader ir = new InputStreamReader(pr.getInputStream()); LineNumberReader input = new LineNumberReader(ir); result = input.readLine(); System.out.println("result:" + result);
問題匯總
1. 安裝Python環(huán)境
運(yùn)行Python會(huì)需要Python環(huán)境,和很多Python的庫,如果沒有就會(huì)報(bào)錯(cuò)。首先安裝Python環(huán)境,我安裝的是Python3.8,這個(gè)有很多教程,就不具體說了。就是下載對應(yīng)版本的安裝包,上傳到服務(wù)器,進(jìn)行安裝。輸入:
python -V
能夠正常顯示出當(dāng)前python的版本號,就是安裝成功了。
2. 缺少Python庫
折騰完P(guān)ython環(huán)境,再次運(yùn)行Python腳本,發(fā)現(xiàn)還報(bào)錯(cuò),可以用上文中查看錯(cuò)誤信息的方法看到Java調(diào)用時(shí)的錯(cuò)誤信息,提示缺少XXX庫,這個(gè)錯(cuò)誤提示就非常明確了,安裝就完了,不過安裝過程也非常曲折,我的是缺少dlib庫,就是和人臉相關(guān)的,這個(gè)網(wǎng)上也有很多教程,我的安裝過程是:首先安裝了miniconda,然后用conda安裝cmake和boost,然后安裝dlib就成功了。
3. 運(yùn)行時(shí)報(bào)錯(cuò)
Python安裝完,各種庫也安裝完了,而且在Linux直接調(diào)用Python腳本已經(jīng)運(yùn)行成功,這時(shí)候正常應(yīng)該沒什么問題了,直接使用Java代碼調(diào)用就可以了,使用如下代碼:
String result = ""; String[] cmd = {"python", "/home/test.py"}; Process pr = Runtime.getRuntime().exec(cmd); InputStreamReader ir = new InputStreamReader(pr.getInputStream()); LineNumberReader input = new LineNumberReader(ir); result = input.readLine(); System.out.println("result:" + result);
依舊報(bào)錯(cuò),找不到庫,不應(yīng)該啊,我在Linux環(huán)境直接用shell窗口都可以運(yùn)行了,說明Linux下的環(huán)境和腳本應(yīng)該都沒有問題,還是Java調(diào)用的問題。經(jīng)過我不斷嘗試和百度,發(fā)現(xiàn)了如下解決方案:
在Java調(diào)用Python時(shí),需要指定Python的目錄,使用如下命令:
which python
查看python使用的路徑,然后在Java調(diào)用的時(shí)候?qū)懗鼋^對路徑:
String[] cmd = {"/root/miniconda3/bin/python", "/home/test.py"};
到此問題解決。
到此這篇關(guān)于Linux環(huán)境下Java調(diào)用Python腳本的常見問題解決的文章就介紹到這了,更多相關(guān)Java調(diào)用Python腳本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java?Springboot對接開發(fā)微信支付詳細(xì)流程
最近要做一個(gè)微信小程序,需要微信支付,所以研究了下怎么在java上集成微信支付功能,下面這篇文章主要給大家介紹了關(guān)于java?Springboot對接開發(fā)微信支付的相關(guān)資料,需要的朋友可以參考下2024-08-08解決SpringBoot搭建MyBatisPlus中selectList遇到LambdaQueryWrapper報(bào)錯(cuò)問題
這篇文章主要介紹了解決SpringBoot搭建MyBatisPlus中selectList遇到LambdaQueryWrapper報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01MyBatis 中 ${}和 #{}的正確使用方法(千萬不要亂用)
這篇文章主要介紹了MyBatis 中 ${}和 #{}的正確使用方法,本文給大家提到了MyBatis 中 ${}和 #{}的區(qū)別,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Mybatis分頁查詢的實(shí)現(xiàn)(Rowbounds和PageHelper)
本文主要介紹了Mybatis分頁查詢的實(shí)現(xiàn)(Rowbounds和PageHelper),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01淺析springboot通過面向接口編程對控制反轉(zhuǎn)IOC的理解
這篇文章主要介紹了springboot通過面向接口編程對控制反轉(zhuǎn)IOC的理解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-08-08SpringCloud Eureka服務(wù)發(fā)現(xiàn)實(shí)現(xiàn)過程
這篇文章主要介紹了SpringCloud Eureka服務(wù)發(fā)現(xiàn)實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11