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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Java】使用Java调用Python的四种方法

發布時間:2025/3/20 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java】使用Java调用Python的四种方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面

為啥一個好好的崗位是Java開發工程師要去做寫python呢?因為產品經理安排的(突然多少有點明白為啥程序員和產品經理會一直開撕)。由于在選擇企業的時候沒看清企業性質,看了要求以為就是互聯網企業,現在看看初為社畜的我還是太天真了。不過既然這幾天已經在寫python腳本了,那也不能浪費這段時間的經歷了,畢竟python的閃光點也不少。于是想一下如何與老本行Java聯系起來,就有了這篇博文。

文章目錄

    • 寫在前面
    • 一、在java類中直接執行python語句
    • 二、在java中直接調用python腳本
    • 三、★★★使用Runtime.getRuntime()執行python腳本文件,推薦使用
    • 四、調用python腳本中的函數

其實調用的方法也不難,具體調用方法有如下四種(如果有其他辦法記得在評論區留下呀):

在使用Java調用python之前,需要導入依賴環境。如,在maven項目中,需要導入如下依賴

<dependency><groupId>org.python</groupId><artifactId>jython-standalone</artifactId><!--python版本是2.x還是3.x在這里指定--><version>2.7.0</version> </dependency>

一、在java類中直接執行python語句

在Java類中調用python語句的方法如下

import org.python.util.PythonInterpreter public class JavaRunPython {public static void main(String[] args) {//首先調用python的解釋器PythonInterpreter interpreter = new PythonInterpreter();//選擇執行的的Python語句interpreter.exec("a='hello world'; ");interpreter.exec("print a;");} }

這種方法用的不多、也不推薦大家使用。這里為了整個文章內容的完成性,我把這種方法放在這里。(控制臺出現“ Failed to install ‘’: java.nio.charset.UnsupportedCharsetException: cp0”的紅標時,不是出錯了,而是兼容沒做好,可以去運行配置中的Arguments中輸入

-Dpython.console.encoding=UTF-8

在正常的情況下,Java工程師只需要調用python開發工程師寫的腳本就行了,不會再在代碼中加入python語句了。因為在Java語言中添加入其他語言,使Java的可讀性下降、執行意義也不是很大(為了一兩行代碼,去導入python包的性價比太低;而且如果行數多了,就應該是集合成腳本并執行腳本了)

二、在java中直接調用python腳本

這種方式是有些Java程序員使用調用。首先將準備好的腳本,如plus.py

a = 1 b = 2 print a + b

則在Java中運行的模式是這樣的:

import org.python.util.PythonInterpreter; public class JavaPythonFile {public static void main(String[] args) {PythonInterpreter interpreter = new PythonInterpreter();//我在這里使用相對路徑,注意區分interpreter.execfile("./plus.py");} }

三、★★★使用Runtime.getRuntime()執行python腳本文件,推薦使用

為什么推薦使用這種方式來調用python腳本呢?
答:由于這種辦法可以讓進程與程序交互??梢钥吹匠霈F的問題,便于解決

如還是調用上面的腳本為例

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class RuntimeFunction {public static void main(String[] args) {Process proc;try {/*附加:String[] args1=new String[]{"/home/huan/anaconda2/bin/python","/home/huan/myfile/pythonfile/helloword.py"};Process pr=Runtime.getRuntime().exec(args1);String數組里的那一行很重要首先一定要設置好你所使用的python的位置,切記不要直接使用python,因為系統會默認使用自帶的python,所以一定要設置好你所使用的python的位置,否則可能會出現意想不到的問題(比如說我使用的是anaconda中的python,而ubuntu系統會默認調用自帶的python,而我自帶的python中并沒有numpy庫,所以會造成相應的代碼不會執行的問題,所以設置好python的位置是很重要的)。還有就是要設置好py文件的位置,使用絕對路徑。在這里插入代碼片還有就是可以看出,此方法可以滿足我們python代碼中調用第三方庫的情況,簡單實用。*/proc = Runtime.getRuntime().exec("python ./plus.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();} } }

對以上代碼的解釋
首先,為什么要創建Process proc。我們可以去看官方文檔:

The ProcessBuilder.start() and Runtime.exec methods create a native process and return an instance of a subclass of Process that can be used to control the process and obtain information about it. The class Process provides methods for performing input from the process, performing output to the process, waiting for the process to complete, checking the exit status of the process, and destroying (killing) the process.

這段文字的意思是: ProcessBuilder.start()和Runtime.exec兩個方法會生成一個本地的進程,然后返回一個Processs子類的實例。通過這個實例可以控制進程以及獲得關于進程的信息。這個Process類為進程提供可用于執行來自的輸入的方法,然后執行輸出到這個進程中,等待完成后,檢查進程退出時的狀態,然后停止這個進程?!獡Q句話說,這個實例就是監視整個進程的。

通過Process的getInputStream(),getOutputStream()和getErrorStream()方法可以得到輸入輸出流,然后通過InputStream可以得到程序對控制臺的輸出信息,通過OutputStream可以給程序輸入指令,這樣就達到了程序的交換功能。

四、調用python腳本中的函數

改造一下python腳本,注意嚴格的縮進。

def add(a,b):a = 1b = 2print a + breturn a+b

調用的代碼

import org.python.core.PyFunction; import org.python.core.PyInteger; import org.python.core.PyObject; import org.python.util.PythonInterpreter; public class Function {public static void main(String[] args) {PythonInterpreter interpreter = new PythonInterpreter();interpreter.execfile("./plus.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);}}

參考文獻:
java調用python的幾種用法(看這篇就夠了)
在Java中調用Python
java調用python代碼

總結

以上是生活随笔為你收集整理的【Java】使用Java调用Python的四种方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。