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 ...
随机推荐
- JMeter使用指南+实验报告
JMeter使用指南 目录 JMeter使用指南 界面基本配置方法 1.选项里的放大与缩小--缩放字体 2.选项里的选择语言 3.命令行的调出 注意事项 一些指标介绍 1.TCP取样器 2.汇总/聚合 ...
- [转]vue项目启动时,npm run serve 和 npm run dev 的区别
npm run serve 和 npm run dev 的区别 在我们运行一些 vue 项目的时候,输入npm run serve或者 npm run dev的其中一个时,系统会报错: PS C:\U ...
- Github无法访问解决办法
Github无法访问解决办法 问题描述:网速正常,但是github无法访问. 解决办法: 1.因为Github网址域名更换.查询网站https://ipchaxun.com/ ,例如输入github. ...
- 即时通讯技术文集(第18期):IM架构设计基础知识合集 [共16篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第18 期. [- 1 -] IM系统的MQ消息中间件选型:Kafka还是RabbitMQ? [ ...
- 《深入理解Mybatis原理》MyBatis配置解析过程
配置解析主体方法 public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfi ...
- 树莓派linux kernel 添加menuconfig菜单选项和编译
https://www.bilibili.com/video/av91990721?zwbcmrpi_defconfig 打开顶层目录下的 Makefile,搜索 %config 找到如下内容: # ...
- c# 设置WebBrowser的UserAgent
void SuppressScriptErrors(WebBrowser webBrowser, bool hide) { webBrowser.Navigating += (s, e) => ...
- spring-boot-@Valid和@Validated详解
---------------------------------------------------------------------------------------- 在实际的项目开发中,经 ...
- Golang-基本语法2
http://c.biancheng.net/golang/syntax/ Go语言变量的声明(使用var关键字) Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变 ...
- w3cschool-Linux 教程
https://www.w3cschool.cn/linux/ Linux 安装 本章节我们将为大家介绍 Linux 的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果自己不想搭建, ...