JAVA调用Python脚本执行
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调用Python脚本执行的更多相关文章
- (转)java调用python脚本
这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用 ...
- 通过Java调用Python脚本
在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...
- java调用python脚本并向python脚本传递参数
1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...
- [Java/Python] java调用python脚本问题记录
Java调用Python的的两种方式 1.Runtime private static String call_python(String input_argv) { String python_py ...
- Java调用Python脚本并获取返回值
在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError.在 ...
- java调用python脚本 并传参(根据配置文件获取python文件地址)
方式一: Java代码 package com.mybatis.plus.utils; import cn.hutool.core.lang.Console; import java.io.Buffe ...
- Java调用Python脚本
今天遇到Java调用一个Python脚本的问题,纠结了大半天,遇到各种问题.网上搜索的大部分都是用jython,但是我想要调用的python脚本里有import urllib,这个urllib也不是什 ...
- java 调用 python 脚本
有时候在java项目里,需要执行Python脚本以下几种方式: 1.直接执行Python脚本代码 引用 org.python包 创建一个 python解释器,貌似这种方式不可以导入第三方库,模块... ...
- Java调用SQL脚本执行的方案
在Java中调用SQL脚本的方式有多种,在这里只记录一种自己常用的方式,个人觉得挺实用方便的. 运用ScriptRunner这个类. import org.apache.ibatis.io.Resou ...
- Java调用Python脚本工具类
[本文出自天外归云的博客园] 在网上查了很多方法都不成功,在google上搜到一篇文章,做了一些小修改,能够处理中文输出.提取一个运行python脚本的Java工具类如下: package com.a ...
随机推荐
- WPF 设置Button的content为多行模式
查找button的子元素是个TextBlock,再设置它的TextWrappingProperty属性为 TextWrapping.Wrap. Button btn2 = new Button() { ...
- ClickHouse-4SQL参考
SQL参考 ClickHouse支持以下形式的查询: SELECT INSERT INTO CREATE ALTER 其他类型的查询 ClickHouse SQL 语句 语句表示可以使用 SQL 查询 ...
- 一、CAN协议基础知识
一.CAN总线基础知识 注:参考江科大教程,瑞萨电子<CAN入门教程>. CAN (Controller Area Network),是ISO国际标准化的串行通信协议.CAN协议经过ISO ...
- VirtualBox配置安装入门(Linux连不上网络和设置共享文件夹)
VirtualBox配置安装入门 一.设置虚拟网卡 1.安装了虚拟机之后,可以在网络选择网卡 网络分为网络地址转换(NAT).桥接网卡.内部网络.仅主机(Host-Only)网络,通用驱动.NAT网络 ...
- 十. Redis 事务和 “锁机制”——> 并发秒杀处理的详细说明
十. Redis 事务和 "锁机制"--> 并发秒杀处理的详细说明 @ 目录 十. Redis 事务和 "锁机制"--> 并发秒杀处理的详细说明 1 ...
- 多云时代!天翼云TeleDB以科技创新释放数据价值
8月17日,在第14届中国数据库技术大会(DTCC2023)上,天翼云科技有限公司数据库首席技术官李跃森以<天翼云TeleDB持续创新之路>为题发表演讲,介绍了天翼云TeleDB数据库的发 ...
- PHP变量与变量作用域
PHP变量与变量作用域 1. 变量的基本概念 在PHP中,变量用于存储各种类型的数据,如字符串.整数.浮点数.布尔值.数组和对象等.变量名以美元符号$开头,后面跟着一个或多个字符(变量名).例如: & ...
- CF1896H2
看不懂的题 首先考虑 \([a_i\neq b_i]=-2a_ib_i+a_i+b_i\),所以: \[f(a,b)=\sum a_i+\sum b_i-2\sum a_ib_i=N-2\sum a_ ...
- Iceberg根据快照查看文件,根据文件查看哪个快照写入
一.背景 用户查询iceberg表时报文件为空,因为存在写入和治理程序同时操作iceberg表,需要查看空文件是哪个快照产生的,方便确定是flink写入缺陷还是spark治理缺陷 二.通过Sql查询文 ...
- dbeaver软件使用问题
一.dbeaver导出数据表到csv后数据乱码 按如下方式导出即可 勾选插入BOM即可 Excel在读取csv的时候是通过读取文件头上的bom来识别编码的,如果文件头无bom信息,则默认按照unico ...