日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Java 调用 Python 方法学习笔记

發(fā)布時(shí)間:2025/3/11 python 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 调用 Python 方法学习笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章轉(zhuǎn)載自:?作者:IT_xiao_bai?
? ? ? ? ? ? ? ? ? ? ? ?來(lái)源:CSDN?
? ? ? ? ? ? ? ? ? ? ? ?原文:https://blog.csdn.net/IT_xiao_bai/article/details/79074988?

前一陣自剛好用python做了一個(gè)sae的算法模型,結(jié)果公司的項(xiàng)目是給予java寫(xiě)的后臺(tái),沒(méi)辦法了,只好網(wǎng)上求助一波發(fā)現(xiàn)博主分享的幾個(gè)方法都挺實(shí)用的,所以先存著,等以后有時(shí)間慢慢研究,這里也先謝謝原博主分享心得。

如何使用Java調(diào)用Python程序

本文為大家介紹如何java調(diào)用python方法,供大家參考。
實(shí)際工程項(xiàng)目中可能會(huì)用到Java和python兩種語(yǔ)言結(jié)合進(jìn)行,這樣就會(huì)涉及到一個(gè)問(wèn)題,就是怎么用Java程序來(lái)調(diào)用已經(jīng)寫(xiě)好的python腳本呢,一共有三種方法可以實(shí)現(xiàn),具體方法分別為大家介紹:

1. 在java類中直接執(zhí)行python語(yǔ)句

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

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

這里我建議下載最新版本的Jpython,因?yàn)榭梢允褂玫膒ython函數(shù)庫(kù)會(huì)比老版本的多些,目前最新版本為2.7。 下載jar包請(qǐng)點(diǎn)擊Download Jython 2.7.0 - Standalone Jar 下載安裝程序請(qǐng)點(diǎn)擊Download Jython 2.7.0 - Installer 如果使用maven依賴添加的話,使用下面的語(yǔ)句 <dependency><groupId>org.python</groupId><artifactId>jython-standalone</artifactId><version>2.7.0</version> </dependency>

以上準(zhǔn)備好了,就可以直接在java類中寫(xiě)python語(yǔ)句了,具體代碼如下:

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

輸出結(jié)果如下:

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

如下圖所示:

2. 在java中調(diào)用本地python腳本

首先在本地建立一個(gè)python腳本,命名

為add.py,寫(xiě)了一個(gè)簡(jiǎn)單的兩個(gè)數(shù)做加法的函數(shù),代碼如下:

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

?python的功能函數(shù)已經(jīng)寫(xiě)好,接下來(lái)我們寫(xiě)一個(gè)java的測(cè)試類(同樣需要用到Jpython包),來(lái)測(cè)試一下是否可以運(yùn)行成功。代碼如下:

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");// 第一個(gè)參數(shù)為期望獲得的函數(shù)(變量)的名字,第二個(gè)參數(shù)為期望返回的對(duì)象類型PyFunction pyFunction = interpreter.get("add", PyFunction.class);int a = 5, b = 10;//調(diào)用函數(shù),如果函數(shù)需要參數(shù),在Java中必須先將參數(shù)轉(zhuǎn)化為對(duì)應(yīng)的“Python類型”P(pán)yObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b)); System.out.println("the anwser is: " + pyobj);} }

運(yùn)行結(jié)果如圖所示:

?

?

OK,測(cè)試成功了~

關(guān)于Jpython更多詳細(xì)的信息可以參考官方的相關(guān)文檔,官網(wǎng)地址:http://www.jython.org/

注意:以上兩個(gè)方法雖然都可以調(diào)用python程序,但是使用Jpython調(diào)用的python庫(kù)不是很多,如果你用以上兩個(gè)方法調(diào)用,而python的程序中使用到第三方庫(kù),這時(shí)就會(huì)報(bào)錯(cuò)java ImportError: No module named xxx。遇到這種情況推薦使用下面的方法,即可解決該問(wèn)題。

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

為了驗(yàn)證該方法可以運(yùn)行含有python第三方庫(kù)的程序,我們先寫(xiě)一個(gè)簡(jiǎn)單的python腳本,代碼如下:

import numpy as npa = np.arange(12).reshape(3,4) print(a)

可以看到程序中用到了numpy第三方庫(kù),并初始化了一個(gè)3×4的一個(gè)矩陣。
下面來(lái)看看怎么用Runtime.getRuntime()方法來(lái)調(diào)用python程序并輸出該結(jié)果,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");// 執(zhí)行py文件//用輸入輸出流來(lái)截取結(jié)果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();} } }

輸出的結(jié)果如下圖所示:

可以看到運(yùn)行成功了,但有的朋友可能會(huì)問(wèn)了,怎么在python程序中函數(shù)傳遞參數(shù)并執(zhí)行出結(jié)果,下面我就舉一例來(lái)說(shuō)明一下。
先寫(xiě)一個(gè)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用于獲取參數(shù)url1,url2等。而sys.argv[0]代表python程序名,所以列表從1開(kāi)始讀取參數(shù)。
以上代碼實(shí)現(xiàn)一個(gè)兩個(gè)數(shù)做加法的程序,下面看看在java中怎么傳遞函數(shù)參數(shù),代碼如下:

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);// 執(zhí)行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是參數(shù)1,url2是參數(shù)2,以此類推。
最后結(jié)果如圖所示:

OK,成功了。

總結(jié)

以上是生活随笔為你收集整理的Java 调用 Python 方法学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。