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

springboot調(diào)用python腳本的實現(xiàn)示例

 更新時間:2024年12月24日 09:20:20   作者:luckilyil  
本文介紹了在SpringBoot應(yīng)用中調(diào)用Python腳本,包括ProcessBuilder類和ApacheCommonsExec庫兩種方法,具有一定的參考價值,感興趣的可以了解一下

在現(xiàn)代軟件開發(fā)中,有時我們需要在 Java 應(yīng)用中調(diào)用外部腳本,比如 Python 腳本。Spring Boot 提供了靈活的方式來集成這些外部腳本。本文將詳細介紹如何在 Spring Boot 應(yīng)用中調(diào)用 Python 腳本,包括兩種不同的方法:使用 Java 的 ProcessBuilder 類和使用 Apache Commons Exec 庫。

準備工作

在開始之前,我們需要準備一個 Python 腳本。請按照以下步驟操作:

  • 在 D 盤創(chuàng)建一個名為 python 的文件夾。
  • 在該文件夾內(nèi)創(chuàng)建一個名為 hello.py 的 Python 腳本,內(nèi)容如下:
print("Hello World!!")
  • 在 Spring Boot 項目中定義 Python 腳本的路徑:
private static final String PATH = "D:\\python\\hello.py";

方法一:使用 ProcessBuilder

ProcessBuilder 是 Java 提供的一個類,允許我們啟動和管理操作系統(tǒng)進程。以下是使用 ProcessBuilder 調(diào)用 Python 腳本的步驟:

1. 編寫測試方法

在 Spring Boot 應(yīng)用中,我們可以編寫一個測試方法來調(diào)用 Python 腳本:

@Test
public void testMethod1() throws IOException, InterruptedException {
    final ProcessBuilder processBuilder = new ProcessBuilder("python", PATH);
    processBuilder.redirectErrorStream(true);

    final Process process = processBuilder.start();

    final BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));

    String s = null;
    while ((s = in.readLine()) != null) {
        System.out.println(s);
    }

    final int exitCode = process.waitFor();
    System.out.println(exitCode == 0);
}

2. 解釋代碼

  • ProcessBuilder 構(gòu)造函數(shù)接受要執(zhí)行的命令和參數(shù)。這里,我們傳遞了 "python" 和腳本路徑 PATH。
  • redirectErrorStream(true) 將錯誤流和標(biāo)準流合并,這樣我們可以從同一個流中讀取輸出。
  • processBuilder.start() 啟動進程。
  • 使用 BufferedReader 讀取進程的輸出。
  • process.waitFor() 等待進程結(jié)束,并返回退出代碼。

方法二:使用 Apache Commons Exec

Apache Commons Exec 提供了一個更高級的 API 來執(zhí)行外部進程。首先,我們需要在項目的 pom.xml 文件中添加依賴:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-exec</artifactId>
    <version>1.3</version>
</dependency>

1. 編寫測試方法

使用 Apache Commons Exec 調(diào)用 Python 腳本的代碼如下:

@Test
public void testMethod2() {
    final String line = "python " + PATH;
    final CommandLine cmdLine = CommandLine.parse(line);

    try (final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
        final PumpStreamHandler streamHandler = new PumpStreamHandler(baos);

        final DefaultExecutor executor = new DefaultExecutor();
        executor.setStreamHandler(streamHandler);

        final int exitCode = executor.execute(cmdLine);

        log.info("調(diào)用Python腳本的執(zhí)行結(jié)果: {}.", exitCode == 0 ? "成功" : "失敗");
        log.info(baos.toString().trim());
    } catch (final IOException e) {
        log.error("調(diào)用Python腳本出錯", e);
    }
}

2. 解釋代碼

  • CommandLine.parse(line) 解析要執(zhí)行的命令。
  • PumpStreamHandler 將輸出流重定向到 ByteArrayOutputStream。
  • DefaultExecutor 用于執(zhí)行命令。
  • executor.execute(cmdLine) 執(zhí)行命令并返回退出代碼。
  • log.info 和 log.error 用于記錄執(zhí)行結(jié)果和錯誤。

Python 腳本的數(shù)據(jù)通過接口讓 Spring Boot 接收

Python 腳本作為服務(wù)

為了讓 Spring Boot 能夠接收 Python 腳本的數(shù)據(jù),我們可以將 Python 腳本包裝成一個 HTTP 服務(wù)。這樣,Spring Boot 可以通過 HTTP 請求來調(diào)用 Python 腳本,并接收其返回的數(shù)據(jù)。以下是實現(xiàn)這一目標(biāo)的步驟:

1. 使用 Flask 創(chuàng)建 Python HTTP 服務(wù)

首先,我們需要在 Python 腳本中添加 Flask 庫來創(chuàng)建一個簡單的 HTTP 服務(wù)。以下是修改后的 hello.py

from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/hello', methods=['GET'])
def hello_world():
    return jsonify(message="Hello World!!")

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

這段代碼創(chuàng)建了一個 Flask 應(yīng)用,它在 5000 端口上運行,并定義了一個 /hello 路由,返回一個 JSON 響應(yīng)。

2. 在 Spring Boot 中調(diào)用 Python HTTP 服務(wù)

現(xiàn)在,我們需要在 Spring Boot 應(yīng)用中調(diào)用這個 Python HTTP 服務(wù)。我們可以使用 RestTemplate 或 WebClient 來發(fā)送 HTTP 請求。

使用 RestTemplate

在 Spring Boot 中,你可以添加 RestTemplate 的依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

然后,創(chuàng)建一個服務(wù)來調(diào)用 Python 服務(wù):

import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class PythonService {
    private static final String PYTHON_SERVICE_URL = "http://localhost:5000/hello";

    public String callPythonService() {
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(PYTHON_SERVICE_URL, String.class);
        return result;
    }
}

使用 WebClient

如果你使用的是 Spring WebFlux,可以使用 WebClient

import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;

@Service
public class PythonService {
    private static final String PYTHON_SERVICE_URL = "http://localhost:5000/hello";
    private final WebClient webClient;

    public PythonService(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.baseUrl(PYTHON_SERVICE_URL).build();
    }

    public String callPythonService() {
        return webClient.get()
                .retrieve()
                .bodyToMono(String.class)
                .block();
    }
}

結(jié)論

通過將 Python 腳本包裝成 HTTP 服務(wù),我們可以更容易地在 Spring Boot 應(yīng)用中調(diào)用 Python 腳本,并接收其返回的數(shù)據(jù)。這種方法不僅適用于 Python 腳本,還可以用于任何可以提供 HTTP 接口的外部服務(wù)。這樣,Spring Boot 應(yīng)用就可以通過標(biāo)準的 HTTP 請求與這些服務(wù)進行交互,實現(xiàn)數(shù)據(jù)的集成和處理。

到此這篇關(guān)于springboot調(diào)用python腳本的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)springboot調(diào)用python腳本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis利用分頁插件PageHelper快速實現(xiàn)分頁查詢

    Mybatis利用分頁插件PageHelper快速實現(xiàn)分頁查詢

    如果你也在用MyBatis,建議嘗試該分頁插件,這一定是最方便使用的分頁插件,這篇文章主要給大家介紹了關(guān)于Mybatis利用分頁插件PageHelper快速實現(xiàn)分頁查詢的相關(guān)資料,PageHelper是一個Mybatis的分頁插件,負責(zé)將已經(jīng)寫好的sql語句,進行分頁加工,需要的朋友可以參考下
    2021-08-08
  • Spring IOC與DI核心重點分析

    Spring IOC與DI核心重點分析

    IOC也是Spring的核心之一了,之前學(xué)的時候是采用xml配置文件的方式去實現(xiàn)的,后來其中也多少穿插了幾個注解,但是沒有說完全采用注解實現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來實現(xiàn)IOC + DI
    2022-10-10
  • Java調(diào)用即夢繪圖API實例Demo

    Java調(diào)用即夢繪圖API實例Demo

    Java提供了多種繪圖API,這篇文章主要介紹了Java調(diào)用即夢繪圖API的相關(guān)資料,文中通過圖文以及代碼介紹的非常詳細,對想學(xué)習(xí)即夢繪圖的同學(xué)們具有一定的參考借鑒價值,需要的朋友可以參考下
    2025-12-12
  • java實現(xiàn)頁面多查詢條件必選的統(tǒng)一處理思路

    java實現(xiàn)頁面多查詢條件必選的統(tǒng)一處理思路

    這篇文章主要為大家介紹了java實現(xiàn)頁面多查詢條件必選的統(tǒng)一處理思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • SpringAop切面執(zhí)行順序?qū)嵺`

    SpringAop切面執(zhí)行順序?qū)嵺`

    本文介紹Spring AOP中自定義切面與內(nèi)置切面的執(zhí)行順序控制方法,通過@Order注解設(shè)置切面優(yōu)先級,確保業(yè)務(wù)邏輯正確執(zhí)行,感興趣的可以了解一下
    2026-04-04
  • JDK安裝與配置超級詳細教程(包含二個或多個JDK的同時安裝)

    JDK安裝與配置超級詳細教程(包含二個或多個JDK的同時安裝)

    這篇文章主要給大家介紹了關(guān)于JDK安裝與配置(包含二個或多個JDK的同時安裝)的相關(guān)資料,對于Java學(xué)習(xí)者來說,一臺電腦拿到手肯定要配置JDK,但是對于新手來說還是容易出錯,需要的朋友可以參考下
    2023-10-10
  • Java8新特性之Stream API詳解

    Java8新特性之Stream API詳解

    這篇文章主要介紹了Java8新特性之StreamAPI詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java格式化輸出詳細講解(printf、print、println、format等)

    Java格式化輸出詳細講解(printf、print、println、format等)

    Java的格式化輸出等同于String.Format,與C有很大的相似,下面這篇文章主要給大家介紹了關(guān)于Java格式化輸出(printf、print、println、format等)的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • 深入學(xué)習(xí)Java單元測試(Junit+Mock+代碼覆蓋率)

    深入學(xué)習(xí)Java單元測試(Junit+Mock+代碼覆蓋率)

    在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標(biāo),甚至,用代碼覆蓋率來考核測試任務(wù)完成情況,比如,代碼覆蓋率必須達到80%或 90%。下面我們就來詳細學(xué)習(xí)下java單元測試吧
    2019-06-06
  • IDEA連接MySQL后管理數(shù)據(jù)庫的操作指南

    IDEA連接MySQL后管理數(shù)據(jù)庫的操作指南

    本節(jié)就來教大家如何在IDEA連接MySQL后管理數(shù)據(jù)庫(創(chuàng)建/修改/刪除數(shù)據(jù)庫、創(chuàng)建/修改/刪除表、插入/更新/刪除/查詢表記錄),文中通過圖文結(jié)合的方式給大家講解的非常詳細,需要的朋友可以參考下
    2024-05-05

最新評論

昌邑市| 象州县| 宜良县| 玉林市| 卢氏县| 延庆县| 天台县| 乌鲁木齐市| 娱乐| 望奎县| 碌曲县| 兰西县| 泰州市| 南投市| 彰化市| 拜城县| 凤山县| 乌兰县| 高邑县| 上虞市| 象州县| 宁化县| 玉林市| 浦城县| 分宜县| 墨江| 牙克石市| 塔河县| 维西| 湄潭县| 淮北市| 仙游县| 清河县| 郴州市| 盐山县| 屯昌县| 田林县| 乌审旗| 神农架林区| 丰都县| 合川市|