• java项目调用python进程


    问题描述

    某一功能是通过python项目实现的,但是主项目是java项目,此时希望在java项目中调用python进程。

    方法

    import lombok.extern.slf4j.Slf4j;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Map;
    @Slf4j
    public class PythonProcess {
        public static void main(String[] args) {
            try {
                // 创建一个ProcessBuilder对象,指定要执行的Python脚本和参数
                ProcessBuilder pb = new ProcessBuilder("C:/Users/18234/.conda/envs/new/python", "E:/ideaCode/code/ui.py");
                // 设置Python环境变量,指定Python库路径
                Map env = pb.environment();
    
                env.put("PYTHONPATH", "C:/Users/18234/.conda/envs/new");
                System.out.println("Virtual environment path: " + env.get("PYTHONPATH"));
    //            pb.directory(new File("path/to/working/directory"));
                pb.directory(new File("E:/ideaCode/code/"));
                // 启动进程
                Process process = pb.start();
                // 添加shutdown hook
                Runtime.getRuntime().addShutdownHook(new Thread() {
                    @Override
                    public void run() {
                        System.out.println("Shutdown hook triggered. Closing Python process...");
                        process.destroy();
                    }
                });
                // 获取进程的输出流
                //注意设置编码格式为utf-8
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
                String line;
                while ((line = reader.readLine()) != null) {
                    // 处理Python进程的输出
                    System.out.println(line);
                }
                BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                String errorLine;
                while ((errorLine = errorReader.readLine()) != null) {
                    System.err.println(errorLine);
                }
                // 等待Python进程执行完毕
    
                int exitCode = process.waitFor();
                System.out.println("Python进程执行完毕,退出码:" + exitCode);
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    遇到的问题

    调用python项目后打印python进程的输入中文乱码
    解决办法
    在python项目增加以下代码,设置编码格式也为utf-8,java项目和python中编码格式保持一致即可。

    import sys
    
    sys.stdout.reconfigure(encoding='utf-8')
    
    • 1
    • 2
    • 3
  • 相关阅读:
    AI虚拟人物 数字人直播,不用出镜,不用露脸的直播方式(附教程 软件)
    OpenCV-交互相关接口
    批发商/分销商会有一波向B2B转型的浪潮
    26版SPSS操作教程(高级教程第十三章)
    【分布式】NCCL部署与测试 - 01
    jenkins结合126邮箱提醒
    LeetCode 753. 破解保险箱【欧拉回路,DFS】困难
    教你使用Prometheus-Operator进行K8s集群监控
    零基础转行,入职军工类测试方向,月薪10K | 既然选择了,就要全力以赴
    路由过滤与引入
  • 原文地址:https://blog.csdn.net/weixin_44792849/article/details/134202663