日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:java編寫的界面可以調(diào)用python嗎

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

創(chuàng)新互聯(lián)專業(yè)提供成都主機(jī)托管四川主機(jī)托管成都服務(wù)器托管四川服務(wù)器托管,支持按月付款!我們的承諾:貴族品質(zhì)、平民價(jià)格,機(jī)房位于中國電信/網(wǎng)通/移動(dòng)機(jī)房,聯(lián)通服務(wù)器托管服務(wù)有保障!

本文為大家介紹如何java調(diào)用python方法,供大家參考。

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

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

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

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

這里我建議下載最新版本的Jpython,因?yàn)榭梢允褂玫膒ython函數(shù)庫會(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依賴添加的話,使用下面的語句:


org.python
jython-standalone
2.7.0

以上準(zhǔn)備好了,就可以直接在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版本的語法

輸出結(jié)果如下:

這里會(huì)看到輸出的結(jié)果都是一樣的,也就是說Jpython兼容python2.x和3.x版本的語句,運(yùn)行速度會(huì)比直接運(yùn)行python程序稍慢一點(diǎn)。

相關(guān)推薦:《Python教程》

但是每次運(yùn)行結(jié)果都會(huì)提示console: Failed to install ‘’: java.nio.charset.UnsupportedCharsetException: cp0. 這樣看起來很煩,因?yàn)槊看芜\(yùn)行結(jié)果都會(huì)出現(xiàn)紅色的提示語句,以為是錯(cuò)誤,程序員應(yīng)該都不愿意看到這一幕,得想個(gè)辦法解決。

解決方法如下:

在要執(zhí)行的代碼上右鍵, Run As>Run Configurations,選擇第二個(gè)頁簽Arguments,在VM arguments中添加以下語句

-Dpython.console.encoding=UTF-8

然后Apply->Run就可以了。

如下圖所示:

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

首先在本地建立一個(gè)python腳本,命名為add.py,寫了一個(gè)簡單的兩個(gè)數(shù)做加法的函數(shù),代碼如下:

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

python的功能函數(shù)已經(jīng)寫好,接下來我們寫一個(gè)java的測試類(同樣需要用到Jpython包),來測試一下是否可以運(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 stub
PythonInterpreter 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類型”
PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b)); 
System.out.println("the anwser is: " + pyobj);
}
}

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

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

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

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

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

可以看到程序中用到了numpy第三方庫,并初始化了一個(gè)3×4的一個(gè)矩陣。

下面來看看怎么用Runtime.getRuntime()方法來調(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 stub
Process proc;
try {
proc = Runtime.getRuntime().exec("python D:\\demo1.py");// 執(zhí)行py文件
//用輸入輸出流來截取結(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ì)問了,怎么在python程序中函數(shù)傳遞參數(shù)并執(zhí)行出結(jié)果,下面我就舉一例來說明一下。

先寫一個(gè)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用于獲取參數(shù)url1,url2等。而sys.argv[0]代表python程序名,所以列表從1開始讀取參數(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,成功了。


網(wǎng)站名稱:創(chuàng)新互聯(lián)Python教程:java編寫的界面可以調(diào)用python嗎
標(biāo)題鏈接:http://www.5511xx.com/article/dpcsegd.html