最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

總結(jié)Java調(diào)用Python程序方法

 更新時(shí)間:2020年08月05日 11:25:11   作者:IT_xiao_bai  
這篇文章主要介紹了總結(jié)Java調(diào)用Python程序方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

本文為大家介紹如何java調(diào)用python方法,供大家參考。
實(shí)際工程項(xiàng)目中可能會(huì)用到Java和python兩種語(yǔ)言結(jié)合進(jìn)行,這樣就會(huì)涉及到一個(gè)問題,就是怎么用Java程序來調(diào)用已經(jīng)寫好的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類中寫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é)果都是一樣的,也就是說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. 這樣看起來很煩,因?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,寫了一個(gè)簡(jiǎn)單的兩個(gè)數(shù)做加法的函數(shù),代碼如下:

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

python的功能函數(shù)已經(jīng)寫好,接下來我們寫一個(gè)java的測(cè)試類(同樣需要用到Jpython包),來測(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 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é)果如圖所示:

在這里插入圖片描述

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

關(guān)于Jpython更多詳細(xì)的信息可以參考官方的相關(guān)文檔,官網(wǎng)地址點(diǎn)這里。

注意:以上兩個(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。遇到這種情況推薦使用下面的方法,即可解決該問題。

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

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

import numpy as np

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

可以看到程序中用到了numpy第三方庫(kù),并初始化了一個(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,成功了。

總結(jié): 以上就是Java調(diào)用python程序的所有方法總結(jié),推薦使用第三種方法,比前兩種方便很多。

到此這篇關(guān)于總結(jié)Java調(diào)用Python程序方法的文章就介紹到這了,更多相關(guān)Java調(diào)用Python程序方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA讀取屬性文件的幾種方法總結(jié)

    JAVA讀取屬性文件的幾種方法總結(jié)

    以下是對(duì)在JAVA中讀取屬性文件的幾種方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-10-10
  • 解決idea無法導(dǎo)入識(shí)別本地類的問題

    解決idea無法導(dǎo)入識(shí)別本地類的問題

    今天做實(shí)驗(yàn)不知道按了哪里不能導(dǎo)入識(shí)別本地的類,只有jar包的類,百度搜索也沒有找到合理的解決方案,經(jīng)過朋友援助問題根源找到,下面小編把解決方法分享給大家,需要的朋友參考下吧
    2021-08-08
  • Mybatis的詳細(xì)使用教程

    Mybatis的詳細(xì)使用教程

    這篇文章主要介紹了Mybatis的詳細(xì)使用教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • Java?抽象類和接口的實(shí)現(xiàn)

    Java?抽象類和接口的實(shí)現(xiàn)

    本文主要介紹了Java?抽象類和接口,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2007-03-03
  • Mybatis 傳參與排序模糊查詢功能實(shí)現(xiàn)

    Mybatis 傳參與排序模糊查詢功能實(shí)現(xiàn)

    這篇文章主要介紹了Mybatis 傳參與排序模糊查詢功能實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-04-04
  • Java利用Socket和IO流實(shí)現(xiàn)文件的上傳與下載

    Java利用Socket和IO流實(shí)現(xiàn)文件的上傳與下載

    本文主要介紹了Java利用Socket和IO流實(shí)現(xiàn)文件的上傳與下載,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • springboot?整合?SA-Token?使用詳解

    springboot?整合?SA-Token?使用詳解

    本文詳細(xì)介紹了SA-Token這款安全框架的使用,并結(jié)合實(shí)際操作演示了如何集成到springboot項(xiàng)目中,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • java實(shí)現(xiàn)投票程序設(shè)計(jì)

    java實(shí)現(xiàn)投票程序設(shè)計(jì)

    這篇文章主要介紹了java實(shí)現(xiàn)投票程序設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 大廠禁止SpringBoot在項(xiàng)目使用Tomcat容器原理解析

    大廠禁止SpringBoot在項(xiàng)目使用Tomcat容器原理解析

    這篇文章主要為大家介紹了大廠禁止SpringBoot在項(xiàng)目使用Tomcat原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Java在Excel中創(chuàng)建多級(jí)分組、折疊或展開分組的實(shí)現(xiàn)

    Java在Excel中創(chuàng)建多級(jí)分組、折疊或展開分組的實(shí)現(xiàn)

    這篇文章主要介紹了Java在Excel中創(chuàng)建多級(jí)分組、折疊或展開分組的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05

最新評(píng)論

泌阳县| 尖扎县| 盈江县| 宁南县| 安乡县| 鸡泽县| 启东市| 邢台县| 梓潼县| 胶州市| 毕节市| 北京市| 郧西县| 汉中市| 武清区| 柯坪县| 五台县| 彰武县| 上犹县| 垦利县| 玉环县| 塔河县| 巴东县| 师宗县| 中方县| 景德镇市| 田阳县| 通海县| 黄梅县| 定南县| 涿州市| 冀州市| 青铜峡市| 会东县| 蒙城县| 平泉县| 百色市| 锡林浩特市| 西畴县| 陵川县| 东乡县|