Java 調用 Python 方法學習筆記

文章轉載自:?作者:IT_xiao_bai?
? ? ? ? ? ? ? ? ? ? ? ?來源:CSDN?
? ? ? ? ? ? ? ? ? ? ? ?原文:https://blog.csdn.net/IT_xiao_bai/article/details/79074988?

前一陣自剛好用python做了一個sae的算法模型,結果公司的項目是給予java寫的后臺,沒辦法了,只好網上求助一波發現博主分享的幾個方法都挺實用的,所以先存著,等以后有時間慢慢研究,這里也先謝謝原博主分享心得。

如何使用Java調用Python程序

本文為大家介紹如何java調用python方法,供大家參考。
實際工程項目中可能會用到Java和python兩種語言結合進行,這樣就會涉及到一個問題,就是怎么用Java程序來調用已經寫好的python腳本呢,一共有三種方法可以實現,具體方法分別為大家介紹:

1. 在java類中直接執行python語句

此方法需要引用org.python包,需要下載Jpython。在這里先介紹一下Jpython。下面引入百科的解釋:

Jython是一種完整的語言,而不是一個Java翻譯器或僅僅是一個Python編譯器,它是一個Python語言在Java中的完全實現。Jython也有很多從CPython中繼承的模塊庫。最有趣的事情是Jython不像CPython或其他任何高級語言,它提供了對其實現語言的一切存取。所以Jython不僅給你提供了Python的庫,同時也提供了所有的Java類。這使其有一個巨大的資源庫。
?

這里我建議下載最新版本的Jpython,因為可以使用的python函數庫會比老版本的多些,目前最新版本為2.7。
下載jar包請點擊Download Jython 2.7.0 - Standalone Jar
下載安裝程序請點擊Download Jython 2.7.0 - Installer
如果使用maven依賴添加的話,使用下面的語句
<dependency><groupId>org.python</groupId><artifactId>jython-standalone</artifactId><version>2.7.0</version>
</dependency>

以上準備好了,就可以直接在java類中寫python語句了,具體代碼如下:

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("a=[5,2,3,9,4,0]; ");
interpreter.exec("print(sorted(a));");  //此處python語句是3.x版本的語法
interpreter.exec("print sorted(a);");   //此處是python語句是2.x版本的語法

輸出結果如下:

這里會看到輸出的結果都是一樣的,也就是說Jpython兼容python2.x和3.x版本的語句,運行速度會比直接運行python程序稍慢一點。
但是每次運行結果都會提示console: Failed to install ‘’: java.nio.charset.UnsupportedCharsetException: cp0. 這樣看起來很煩,因為每次運行結果都會出現紅色的提示語句,以為是錯誤,程序員應該都不愿意看到這一幕,得想個辦法解決。
解決方法如下:
在要執行的代碼上右鍵, Run As>Run Configurations,選擇第二個頁簽Arguments,在VM arguments中添加以下語句
-Dpython.console.encoding=UTF-8
然后Apply->Run就可以了。

如下圖所示:

2. 在java中調用本地python腳本

首先在本地建立一個python腳本,命名

為add.py,寫了一個簡單的兩個數做加法的函數,代碼如下:

def add(a,b):return a + b

?python的功能函數已經寫好,接下來我們寫一個java的測試類(同樣需要用到Jpython包),來測試一下是否可以運行成功。代碼如下:

import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;public class Java_Python_test {public static void main(String[] args) {// TODO Auto-generated method stubPythonInterpreter interpreter = new PythonInterpreter();interpreter.execfile("D:\\add.py");// 第一個參數為期望獲得的函數(變量)的名字,第二個參數為期望返回的對象類型PyFunction pyFunction = interpreter.get("add", PyFunction.class);int a = 5, b = 10;//調用函數,如果函數需要參數,在Java中必須先將參數轉化為對應的“Python類型”PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b)); System.out.println("the anwser is: " + pyobj);}
}

運行結果如圖所示:

?

?

OK,測試成功了~

關于Jpython更多詳細的信息可以參考官方的相關文檔,官網地址:http://www.jython.org/

注意:以上兩個方法雖然都可以調用python程序,但是使用Jpython調用的python庫不是很多,如果你用以上兩個方法調用,而python的程序中使用到第三方庫,這時就會報錯java ImportError: No module named xxx。遇到這種情況推薦使用下面的方法,即可解決該問題。

3. 使用Runtime.getRuntime()執行腳本文件(推薦)

為了驗證該方法可以運行含有python第三方庫的程序,我們先寫一個簡單的python腳本,代碼如下:

import numpy as npa = 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 stubProcess 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 sysdef 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[] args = new String[] { "python", "D:\\demo2.py", String.valueOf(a), String.valueOf(b) };Process proc = Runtime.getRuntime().exec(args);// 執行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();
}

其中args是String[] { “python”,path,url1,url2 }; ,path是python程序所在的路徑,url1是參數1,url2是參數2,以此類推。
最后結果如圖所示:

OK,成功了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540112.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

catia怎么將特征參數化_VSLAM中特征點的參數化表示

VSLAM中特征點的參數化表示有很多&#xff0c;最直接的是用三維坐標XYZ來表示&#xff0c;但通常大家更喜歡用逆深度表示&#xff0c;因為逆深度優勢在于能夠建模無窮遠點。Open VINS文檔中給出了五種特征參數化表示&#xff1a;Global XYZ&#xff0c;Global Inverse Depth&am…

【廣州】Web前端工程師

互聯網公司找人咯~ 我們公司&#xff1a;道樂科技&#xff08;Dollar Tech&#xff09;成立于2013年11月&#xff0c;是一家致力于為資產管理和財富管理行業提供技術、產品和運營服務的科技金融企業。三年來&#xff0c;道樂人始終堅持“以客戶為中心&#xff0c;為客戶提供高品…

Java 調用 Python 方法學習筆記---之---java調用python深度學習模型運算并返回運算結果給前端(2)

上一章寫到Java 調用 Python 方法學習的三種方法&#xff0c;這里強調第三種方法。第三種方法本質上和第二種方法是一樣的&#xff0c;都是應用到 Runtime.getRuntime().exec() 去執行文件。要深度理解這種方法&#xff0c;首先要先理解一下Runtime.getRuntime().exec() 。 R…

tbslog亂碼轉換_日文游戲亂碼怎么辦 亂碼轉換工具LocaleEmulator

by Nicho Feb.23,2017許多日文游戲有諸多地區限制&#xff0c;在 win7、win8、win10 上玩時候會經常遇到日文游戲亂碼的情況&#xff0c;這時候就得用到亂碼轉換工具了&#xff0c;下面我們就來詳細說明下使用方法。常用的有 microsoft locale、applocale、NTLEA 等&…

haarcascades---各種分類器xml文件下載地址

安裝好opencv想找個人臉識別的小實驗做做&#xff0c;后來發現沒有配置文件&#xff0c;于是乎就找到了這個&#xff0c;所以就轉載過來了。 下載地址&#xff1a;https://github.com/opencv/opencv/tree/master/data/haarcascades 轉載地址&#xff1a;https://blog.csdn.ne…

vue 組件屬性監聽_vuejs組件內的對象屬性監聽問題

跟數據類型是有關的。當你把一個普通的 JavaScript 對象傳給 Vue 實例的 data 選項&#xff0c;Vue 將遍歷此對象所有的屬性&#xff0c;并使用 Object.defineProperty 把這些屬性全部轉為 getter/setter。但是不是所有的變動都可以通過set/get捕捉到&#xff0c;比如一個數組l…

Part 2: Containers

要求 安裝了1.13或者更高版本的Docker閱讀了Part1中的定位&#xff08;我沒寫&#xff09;介紹 是時候用Docker構建一個app了。我們會從構建這樣一個app的最底層開始&#xff0c;容器——我們這節所介紹的內容。在這層之上是服務&#xff0c;服務定義了容器們的在生產中的行為&…

(論文)WS-DAN (弱監督數據增強)

背景 近期在做外賣分類的項目&#xff0c;外賣分類屬于細粒度圖像分類&#xff0c;在分類的過程中要從圖片的行人中和非機動車中區分出各類外賣&#xff08;主要是美團、餓了嗎&#xff09;。剛好近期發現了一片關于細粒度圖像分類較新的論文&#xff08;See Better Before Lo…

羅馬音平假名片假名轉換器_關于五十音你所要知道的一切!文末附日網高清字帖...

今天開始&#xff0c;木子小花日本語教室將開始同時更新日語文法系列文章 和 日語真題詳解系列文章&#xff0c;從五十音圖的記憶方法到日語助詞的用法整理&#xff0c;從N5的簡單句子構成到N1復雜文法的接續記憶方法&#xff0c;力求做出全知乎&#xff08;小聲&#xff1a;全…

django的web開發筆記1(智能診斷系統數據概覽記錄)

接于上一篇&#xff0c;這一篇主要記錄如何鏈接mysql數據庫以及從數據庫中調用數據信息到頁面&#xff0c;同時包含百度地圖api的一些使用。 其中包括模塊&#xff0c;echert圖表繪制數據調用&#xff0c;百度地圖數據信息調用以及一些單機效果&#xff0c;頁面數據調用等。 1…

Spring中應用反射機制淺析

我們知道,Spring中大量使用了反射機制&#xff0c;那么究竟是什么地方使用了呢&#xff1f;就從源頭說起吧。 一 反射源頭Class類 對類的概念我們已經非常熟悉了。比如可以有Student這個類&#xff0c;Person這個類。但是我們要知道&#xff0c;有一個叫Class的類&#xff0c;…

ios nslog 例子_iOS開發-使用宏自定義輸出(NSLog)

前言&#xff1a;1)輸出日志是會大量損耗系統性能2)輸出的信息很容易會被截取到&#xff0c;導致信息不安全。所以我們會在發行版(Release)取消所有的Log。如果一行一行地去注釋掉Log&#xff0c;顯然不是一個明確的選擇。因此我們可以使用宏去自定義Log輸出。最簡單的一個例子…

python小技巧積累--題庫(持續更新)

介紹 作為一名程序員&#xff0c;除了需要具備解決問題的思路以外&#xff0c;代碼的質量和簡潔性也很關鍵。 python內置庫中就有很多簡潔而又優雅的操作&#xff0c;這里的知識都來源于網絡積累&#xff0c; 閑暇時整理下來方便溫故。目錄 >選擇正確的內置功能 使用enum…

提高SQL執行性能方案:如何讓你的SQL運行得更快

---- 人們在使用SQL時往往會陷入一個誤區&#xff0c;即太關注于所得的結果是否正確&#xff0c;而忽略了不同的實現方法之間可能存在的性能差異&#xff0c;這種性能差異在大型的或是復雜的數據庫環境中&#xff08;如聯機事務處理OLTP或決策支持系統DSS&#xff09;中表現得尤…

休眠后gpio狀態_STM32中GPIO的8種工作模式總結

STM32中GPIO的8種工作模式總結一、推挽輸出&#xff1a;可以輸出高、低電平&#xff0c;連接數字器件;推挽結構一般是指兩個三極管分別受兩個互補信號的控制&#xff0c;總是在一個三極管導通的時候另一個截止。高低電平由IC的電源決定。形象點解釋&#xff1a;推挽&#xff0c…

Ubuntu16.04 下 tensorRT安裝

環境準備 主要是根據工程環境需要&#xff0c;參考trt文檔安裝trt 1.查看trt適配情況 &#xff1a;鏈接跳轉&#xff0c;注意&#xff0c;不同版本的trt有不同版本的文檔&#xff0c;請以最新文檔為準。 2.根據自己系統情況下載相關包 因為我自己拉的docker鏡像是ubuntu16.04…

左右xcode的重構選項的一些理解

Rename(重命名):對標示符進行重命名,以獲得更好的代碼可讀性,這些標示符包含類,方法或者函數的名稱. Extract(抽取):將你在XCode種選擇的代碼抽取到一個新的方法或函數中. Create SuperClass(創建父類):為Xcode中當前所選的類定義父類 Move Up(上移):將所選擇的方法,屬性,或實例…

window 如何查看tomcat 實時日志_如何處理生產環境Tomcat的catalina.out日志?

前語&#xff1a;不要為了讀文章而讀文章&#xff0c;一定要帶著問題來讀文章&#xff0c;勤思考。作者&#xff1a;jmcui 來源&#xff1a;http://1t.click/x4q# 前言隨著每天業務的增長&#xff0c;Tomcat 的catalina.out日志 變得越來越大&#xff0c;占用磁盤空間不說。要…

zabbix的agent端的主動模式關鍵三個參數

如多主機超過300和隊列內容過多,就采用主動模式. [rootweb03 zabbix]# egrep -v "^#|^$" zabbix_agentd.conf PidFile/var/run/zabbix/zabbix_agentd.pid LogFile/var/log/zabbix/zabbix_agentd.log LogFileSize0 StartAgents0 ServerActive172.16.1.8 Hostnameweb03…

opencv 繪制坐標曲線_OpenCV手工實現灰度及RGB直方圖

#include #include#include#include#include#include#include#include#includeusing namespacecv;using namespacestd;//單通道圖片直方圖繪制void drawHist(vectornums){Mat hist Mat::zeros(600, 800, CV_8UC3);auto Max max_element(nums.begin(), nums.end());//max迭代器類…