欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

總結Java調用Python程序方法

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

如何使用Java調用Python程序

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

1. 在java類中直接執(zhí)行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. 這樣看起來很煩,因為每次運行結果都會出現紅色的提示語句,以為是錯誤,程序員應該都不愿意看到這一幕,得想個辦法解決。
解決方法如下:
在要執(zhí)行的代碼上右鍵, 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 stub
		PythonInterpreter 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更多詳細的信息可以參考官方的相關文檔,官網地址點這里。

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

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

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

import numpy as np

a = 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 stub
		Process proc;
		try {
			proc = Runtime.getRuntime().exec("python D:\\demo1.py");// 執(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();
		} 
	}
}

輸出的結果如下圖所示:

在這里插入圖片描述

可以看到運行成功了,但有的朋友可能會問了,怎么在python程序中函數傳遞參數并執(zhí)行出結果,下面我就舉一例來說明一下。
先寫一個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用于獲取參數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);// 執(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是參數1,url2是參數2,以此類推。
最后結果如圖所示:

在這里插入圖片描述

OK,成功了。

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

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

相關文章

  • springboot實現用戶名查找用戶功能

    springboot實現用戶名查找用戶功能

    本文主要介紹了springboot實現用戶名查找用戶功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 指定jdk啟動jar包的方法總結

    指定jdk啟動jar包的方法總結

    這篇文章主要給大家總結介紹了關于指定jdk啟動jar包的方法,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-07-07
  • Java中BufferedReader與BufferedWriter類的使用示例

    Java中BufferedReader與BufferedWriter類的使用示例

    BufferedReader與BufferedWriter分別繼承于Reader和Writer類,分別為字符的讀取和寫入添加緩沖功能,這里我們就來看一下Java中BufferedReader與BufferedWriter類的使用示例:
    2016-06-06
  • Java SpringMVC自學自講

    Java SpringMVC自學自講

    本篇文章主要介紹了java SpringMVC——如何獲取請求參數詳解,詳細的介紹了每種參數注解的用法及其實例。感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringBoot項目在IntelliJ IDEA中如何實現熱部署

    SpringBoot項目在IntelliJ IDEA中如何實現熱部署

    spring-boot-devtools是一個為開發(fā)者服務的一個模塊,其中最重要的功能就是自動應用代碼更改到最新的App上面去。,這篇文章主要介紹了SpringBoot項目在IntelliJ IDEA中如何實現熱部署,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 初次體驗MyBatis的注意事項

    初次體驗MyBatis的注意事項

    今天給大家?guī)淼氖顷P于MyBatis的相關知識,文章圍繞著MyBatis的用法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java?Web應用小案例之實現用戶登錄功能全過程

    Java?Web應用小案例之實現用戶登錄功能全過程

    在Java開發(fā)過程中實現用戶的注冊功能是最基本的,這篇文章主要給大家介紹了關于Java?Web應用小案例之實現用戶登錄功能的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • Java之Spring AOP 實現用戶權限驗證

    Java之Spring AOP 實現用戶權限驗證

    本篇文章主要介紹了Java之Spring AOP 實現用戶權限驗證,用戶登錄、權限管理這些是必不可少的業(yè)務邏輯,具有一定的參考價值,有興趣的可以了解一下。
    2017-02-02
  • Java如何生成4位、6位隨機數短信驗證碼(高效實現)

    Java如何生成4位、6位隨機數短信驗證碼(高效實現)

    這篇文章主要介紹了Java如何生成4位、6位隨機數短信驗證碼(高效實現),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java及數據庫對日期進行格式化方式

    Java及數據庫對日期進行格式化方式

    這篇文章主要介紹了Java及數據庫對日期進行格式化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論