首页 > 编程语言 >JAVA调用Python脚本执行

JAVA调用Python脚本执行

时间:2024-01-25 16:57:55浏览次数:55  
标签:调用 JAVA String Python resp new sql import datahub

SpringBoot-web环境

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

springboot--启动类

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication sp = new SpringApplication(DemoApplication.class);
        sp.addListeners(new ApplicationPidFileWriter());
        ConfigurableApplicationContext applicationContext = sp.run(args);
        Environment env = applicationContext.getEnvironment();
        String port = env.getProperty("server.port");
        System.out.print("\n----------------------------------------------------------\n\t" +
                "Application is running! Access URL:\n\t" +
                "Local: \t\thttp://localhost:" + port + "/\n\t" +
                "----------------------------------------------------------\n\t");
    }

}

RestController接口


package com.example.demo.demos.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/datahub")
public class SqlLineageController {

    @Value("${datahub.sqllineage.shell.path:/home/datahub/sqlShell}")
    private String sqlShellPath;

    @Value("${datahub.sqllineage.shell.python.name:lineage_emitter_dataset_finegrained_sample.py}")
    private String pythonShellName;


    @Value("${datahub.sqllineage.shell.python.version:python3}")
    private String pythonShellVersion;

    private String sqlTextName = "/sql.txt";

    @RequestMapping(value = "/sqlEncodeBase64", method = {RequestMethod.GET, RequestMethod.POST})
    public String createTableLineage(@RequestParam("sql") String sql) throws IOException {
        byte[] encode = Base64.getEncoder().encode(sql.getBytes(StandardCharsets.UTF_8));
       return new String(encode,StandardCharsets.UTF_8);
    }

    @RequestMapping(value = "/createTableLineage", method = {RequestMethod.GET, RequestMethod.POST})
    public Map<String, Object> createTableLineage(@RequestBody Map<String, Object> sql, HttpServletRequest request) {
        Map<String, Object> resp = new HashMap<>();
        resp.put("code", 500);
        try {
            Object insertLineageSql = null;
            if (sql.containsKey("sql")) {
                insertLineageSql = sql.get("sql");
            } else {
                resp.put("msg", "SQl必传....");
                return resp;
            }
            String executeSqlBase64 = insertLineageSql.toString();
            byte[] decodedBytes = Base64.getDecoder().decode(executeSqlBase64);
            String executeSql = new String(decodedBytes, StandardCharsets.UTF_8);
            String categorySql = URLDecoder.decode(executeSql, "UTF-8").replace("\t"," ");
            int i = executePythonSql(sqlShellPath, categorySql);
            System.out.println(executeSql + "执行结果:" + i);
            if (i == 0) {
                resp.put("code", 200);
                resp.put("msg", "success");
                return resp;
            }
            resp.put("msg", "服务器错误....");
            return resp;
        } catch (IOException e) {
            resp.put("msg", e.getMessage());
            return resp;
        }
    }

    public int executePythonSql(String sqlPythonLocalValue, String sql) throws IOException {
        FileWriter fileWriter = new FileWriter(sqlPythonLocalValue + sqlTextName);
        fileWriter.write("");
        fileWriter.write(sql);
        fileWriter.close();
        // 定义要执行的Shell命令
        String command = pythonShellVersion + " " + sqlPythonLocalValue + "/" + pythonShellName;

        System.out.println(command);
        try {
            // 开始执行Shell命令并获取输入流
            Process process = new ProcessBuilder()
                    .command("bash", "-c", command)
                    .redirectErrorStream(true)
                    .start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            StringBuilder output = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                output.append(line).append("\n");
            }
            int exitCode = process.waitFor();
            System.out.println("Exit Code: " + exitCode);
            System.out.println("Output:\n" + output.toString());
            return exitCode;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 1;
    }

}

配置 命令执行的Python脚本位置

datahub.sqllineage.shell.path=/home/datahub/sqlShell
datahub.sqllineage.shell.python.name=lineage_emitter_dataset_finegrained_sample.py
datahub.sqllineage.shell.python.version=python3

结束。。。

标签:调用,JAVA,String,Python,resp,new,sql,import,datahub
From: https://www.cnblogs.com/gtnotgod/p/17987506

相关文章

  • python代码
    #读取.mat文件mat_data=scipy.io.loadmat('C.mat')#获取矩阵数据adj_matrix=mat_data['C']一个简短的python代码:alph=['A','B','C','D','E','F','G','H','I','J......
  • java aspect 切面怎么获取 POST 数据
    javaaspect切面怎么获取POST数据/***切面*/@Aspect@ComponentpublicclassPostRequestBodyAspect{@Pointcut("execution(*com.example.controller.*.*(..))")publicvoidcontrollerMethods(){}......
  • html 中javascript 如何被调用
    在HTML中,JavaScript可以通过多种方式进行调用。1.内联脚本(InlineScript):直接将JavaScript代码写入到HTML文件的<script>标签中。示例代码如下所示:<!DOCTYPEhtml><html><head><title>使用内联脚本</title></head><body><!--HTML页面内容--><scripttyp......
  • Python基础语法:代码规范、判断语句与循环语句
    Python是一种高级、动态类型的编程语言,其语法清晰、简洁,易于学习。本文将介绍Python基础语法中的代码规范、判断语句和循环语句。一、代码规范良好的代码规范可以提高代码的可读性和可维护性。在Python中,有一些常见的代码规范建议:使用有意义的变量名。变量名应该清晰地描述变量的用......
  • JAVA学习笔记--使用Inte IDEA
    使用IntellijIDEA编写代码新建项目创建新项目选择创建一个空项目并输入项目名弹出ProjecStructure窗口先关闭新建一个模板(Module)并输入模板名打开前面关闭的ProjecStructure窗口修改以下信息(注意:安装的是JDK8则按照以下信息修改,若安装的是JDK其他版本则......
  • JAVA学习笔记--数据类型及注意事项
    Java的数据类型(笔试考题)Java是强类型语言:要求变量使用要严格符合规定,所有变量都必须先定义后才能使用基本类型(primitivetype)数据类型整数类型byte(1字节):-128~127short(2字节):-32768~32767int(4字节):-2147483648~2147483647(最常用)long(8字节):-9223372036854775808~922......
  • JAVA学习笔记--变量与常量
    变量局部变量注意:必须声明并且必须初始化值publicclassHello{//main方法publicstaticvoidmain(String[]args){//局部变量,只在{}内使用inti=10;System.out.print(i);}//其他方法publicvoidadd(){......
  • 2024年1月Java项目开发指南6:接口测试
    我们使用APIFox这款工具对接口进行测试。(你要是会其他的例如postman进行测试也行)https://apifox.com/新建一个项目,新增一个接口因为这个接口没有参数,所以无需填写参数,保存然后点击运行没有设置环境记得先去设置环境我们配置开发环境保存然后选择开发环境进行使用......
  • 2024年1月Java项目开发指南5:controller、service、mapper
    准备工作你知道什么是JSON吗?JSON是什么?格式是什么?有什么用?有什么优点?有什么缺点?请自己百度探索一下,对JSON做了个了解,如果你不知道什么是JSON的话,知道就免了,直接下一步吧。开始:项目目录结构先确保你已经创建了上图的那些文件夹。这都是我们需要用到。简单的做个介绍co......
  • Java中SimpleDateFormat时YYYY与yyyy以及HH和hh的区别注意踩坑
    场景Java开发手册中为什么要求SimpleDateFormat时用y表示年,而不能用Y:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131052335在使用SimpleDateFormat在获取当前日期时因使用了YYYY导致20231231这个日期被格式化为20241231这里推荐在日期处理时统一使用封装工具......