java如何调用python.py文件并传参

注意: java调用python.py文件并传参,在windows和linux中使用是不一样的

我在windows操作系统中,java调用python文件并传参,是这样写的:完全没问题

复制代码
try {
            Integer totalTestCaseCount = 0;
            //传入python文件的参数: String xmindFilePath, String testCaseKeyWord
            for (String keyword : testCaseKeyWord.split(",")) { //英文逗号作为分隔符号
                String parameterData = "python " + pythonFilePath + " \"" + xmindFilePath + "\" \"" + keyword + "\"";//因为xmindFilePath和keyword的值可能有空格,所以需要双引号
                Process process = Runtime.getRuntime().exec(parameterData);
                //获取Pyhton输出字符串 作为输入流被Java读取
                BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String s = null;
                Integer testCaseCount = 0;
                while ((s = in.readLine()) != null) {
                    //                System.out.println(s);
                    testCaseCount = Integer.valueOf(s);
                }
                logger.info("Get Test Case keyword {}'s count is {} from xmind file", keyword, testCaseCount);
                in.close();

                final int exitCode = process.waitFor();
                logger.info("Run python file result status is {}", exitCode);
                totalTestCaseCount += testCaseCount;
            }
            return totalTestCaseCount;
        } catch (IOException e) {
            logger.info(e.toString());
        } catch (InterruptedException e) {
            logger.info(e.toString());
        }
复制代码

 

但是当代码放到linux服务器中去执行时,就不起作用了:

final int exitCode = process.waitFor()
获取到的exitCode 值就等于1(调用失败),但是我在linux服务器上去执行执行又一切正常~ 我就搞不懂原因了,所以换了下面这种方式去传参,就ok了,我也不知道为啥上面的方式在linux中就不失败了,如果走过路过的您知道原因,欢迎留言
复制代码
try {
            Integer totalTestCaseCount = 0;
            //传入python文件的参数: String xmindFilePath, String testCaseKeyWord
            for (String keyword : testCaseKeyWord.split(",")) { //英文逗号作为分隔符号
                String pythonPath = "";
                String osName = System.getProperty("os.name");//判断操作系统
                if (osName.startsWith("Windows")) {
                    pythonPath = "python";
//                    parameterData = "python " + pythonFilePath + " \"" + xmindFilePath + "\" \"" + keyword + "\"";//因为xmindFilePath和keyword的值可能有空格,所以需要双引号
                } else {
                    pythonPath = "/usr/bin/python";
//                    parameterData = "/usr/bin/python " + pythonFilePath + " \"" + xmindFilePath + "\" \"" + keyword + "\"";//因为xmindFilePath和keyword的值可能有空格,所以需要双引号
                }
                String[] parameterData = new String[]{pythonPath, pythonFilePath, xmindFilePath, keyword};//第二个为python脚本所在位置,后面的为所传参数(得是字符串类型)
                logger.info("Python command is: {}", parameterData);
                Process process = Runtime.getRuntime().exec(parameterData);
                //获取Pyhton输出字符串 作为输入流被Java读取
                BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"gb2312"));//解决中文乱码,参数可传中文
                String line = null;
                Integer testCaseCount =0;
                while ((line = in.readLine()) != null) {
                    logger.info("The response data from python readFileUtil is :{}",line);
                    testCaseCount = Integer.valueOf(line);
                }
                in.close();
//方法二
// InputStreamReader stdin = new InputStreamReader(process.getInputStream()); // LineNumberReader input = new LineNumberReader(stdin); // String result = input.readLine(); // Integer testCaseCount = Integer.valueOf(result); // stdin.close(); // input.close(); logger.info("Get Test Case keyword {}'s count is {} from xmind file", keyword, testCaseCount); final int exitCode = process.waitFor(); logger.info("Run python file result status is {}, just 0 is normal status", exitCode); totalTestCaseCount += testCaseCount; } return totalTestCaseCount; } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }
复制代码

 

posted @   苹果芒  阅读(684)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示