SpringBoot应用:调用Python脚本,并传递数据库信息

创建一个SpringBoot项目

pom.xml :



	4.0.0
	
		org.springframework.boot
		spring-boot-starter-parent
		2.4.4
		 
	
	com.carlos
	javacallspython
	0.0.1-SNAPSHOT
	javacallspython
	Demo project for Spring Boot
	
		1.8
	
	
		
			org.springframework.boot
			spring-boot-starter-web
		

		
			org.springframework.boot
			spring-boot-starter-test
			test
		

		
			com.alibaba
			fastjson
			1.2.52.sec06
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	


application.properties

配置数据库信息,python脚本地址和python程序地址

spring.datasource.url=jdbc:mysql://localhost:3306/carlos
spring.datasource.username=root
spring.datasource.password=12345678

spring.application.name=carlos
server.port=9999


carlos.python.script.path=/Users/carlos/IdeaProjects/CallPython/pyScript/main.py
carlos.python.path=/usr/bin/python3

controller.java,编写一个controller,调用service

@RestController
public class CallPythonController {

    private final CallPythonService callPythonService;

    public CallPythonController(CallPythonService callPythonService) {
        this.callPythonService = callPythonService;
    }

    @PostMapping("/compute")
    public Object callPython() throws IOException {
        return callPythonService.compute();
    }
}

service.java 编写调用脚本程序,具体见注释:

@Service
public class CallPythonServiceImpl implements CallPythonService {

    @Value("${carlos.python.script.path}")
    private String pythonScriptPath;

    @Value("${carlos.python.path}")
    private String pythonPath;

    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;


    @Override
    public Object compute() throws IOException {

        Map res = new HashMap<>();
//        解析数据库信息
        String cleanUrl = url.substring(5);
        URI uri = URI.create(cleanUrl);
        String host = uri.getHost();
        String database = uri.getPath().replace("/", "");

//        传递数据库参数,便于python脚本中操作数据库,并与项目参数保持一致,也可以传递其他参数
        String[] arg = new String[]{pythonPath, pythonScriptPath,
                host, database, username, password};
//        打印出来的命令行,也是在bash或者cmd上执行的命令,可预先测试下
        System.out.println("=======================command line=======================");
        for (String s : arg) {
            System.out.print(s + " ");
        }
        System.out.println("\n=======================command line=======================");
        Process proc;
        BufferedReader in = null;
        try {
            proc = Runtime.getRuntime().exec(arg); // 执行py文件
            in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line;

            while ((line = in.readLine()) != null) {
//                打印python脚本输出
                System.out.println(line);
//                判断是否为返回结果
                if (line.startsWith("{") && line.endsWith("}") && line.contains("msg") && line.contains("status")){
                    return JSON.parse(line);
                }
            }

            in.close();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if (in != null){
                in.close();
            }
        }

        res.put("status", "error");
        res.put("msg", "python script run error");

        return res;

    }
}

编写调用脚本

from my_package import compute
import sys

host = sys.argv[1]
database = sys.argv[2]
username = sys.argv[3]
password = sys.argv[4]


if __name__ == "__main__":
	compute(host, database, username, password)

注意这里使用的sys.argv来获取命令行参数,其中第一个参数为脚本地址,所以实际的参数是从第二个开始,索引为1。

测试脚本

SpringBoot应用:调用Python脚本,并传递数据库信息_第1张图片

脚本可以正常运行。

启动项目,通过postman测试接口:

SpringBoot应用:调用Python脚本,并传递数据库信息_第2张图片

后台打印:

SpringBoot应用:调用Python脚本,并传递数据库信息_第3张图片

这里可以看到测试成功,打印出命令行和脚本运行信息。

如果没有看到预期的脚本信息,可通过命令行测试具体问题。

 

本文coding地址:https://gitee.com/carlos_code/java-calls-python.git

 

你可能感兴趣的:(Python,Spring,java调用python,spring调用python)