• 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
  • 相关阅读:
    AR Engine运动跟踪能力,高精度实现沉浸式AR体验
    6.1 - 6.2 公钥密码学简介
    设计一个基于 GraphQL 的 Node.js 工单系统
    网络安全(黑客)自学
    “淘宝” 开放平台接口设计思路|开放平台接口接入流程教程
    【test】文章测试
    内存池的实现与场景分析
    [第十三篇]——Docker Compose
    PID--位置型PID和增量式PID比较
    hive-join
  • 原文地址:https://blog.csdn.net/weixin_44792849/article/details/134202663