java - 以编程方式从java调用Linux终端中的python脚本

标签 java python linux terminal processbuilder

我正在开发一个 Java 应用程序来检查源文件中的补丁(如果有或没有)。检测补丁更改的核心逻辑存在于 python 脚本 [标题为“patch.py​​”] 中,我的 Java 应用程序与此 Python 补丁脚本通信以检索操作的退出状态。

python脚本可以从here获取

在 Windows 中,它工作正常,但在 Linux 环境中。脚本本身没有从 Java 应用程序中调用。我不确定哪里出错了。

我正在使用“ProcessBuilder”来调用 python 脚本,源代码如下:

if (System.getProperty("os.name").indexOf("Windows") != -1) {

            ArrayList<String> command = new ArrayList<String>();
            //Cmd prompt will be launched, if platform is Windows.
            command.add("cmd");
            command.add("/c");
            command.add("python");

            command.add("lib/patch.py");
            command.add("-d");
            command.add(auxSrcFile);
            command.add(diffFileLoc);
            command.add("--revert");   // switch to revert the patch

            pb = new ProcessBuilder(command);
        } else {
            ArrayList<String> command = new ArrayList<String>();
            //xterm will be launched, if platform is Linux.
            command.add("xterm");
            command.add("-e");
            command.add("python");
            command.add("lib/patch.py");
            command.add("-d");
            command.add(auxSrcFile);
            command.add(diffFileLoc);
            command.add("--revert");    // switch to revert the patch

            pb = new ProcessBuilder(command);
        }

        if (pb != null) {

            p = pb.start();                         
            if (p != null) {
                p.waitFor();
            }
        }   
        int exitStatus = p.exitValue();
        if(exitStatus == 1) {
            System.out.println("...OK");
            System.out.println(" ----Patch detected------");    
        } else {
            System.out.println("...ERROR");
            System.out.println(" ----Patch not found------");
        }

如果在 Windows 中运行 Java 应用程序,则 python 脚本被正确调用,而如果我在 Linux 环境中运行该应用程序,则会失败。

欢迎提出建议!!

注意:我可以独立运行“patch.py​​”脚本(在 Linux 终端中),但是当我尝试从我的 Java 应用程序调用它时,我无法调用它并且总是得到一个退出值为“0”。

最佳答案

Runtime.getRuntime().exec(cmd) 解决了这个问题。

下面的代码片段效果很好

String[] cmd = {
                "python","lib/patch.py",
                "-d", auxSrcFile,
                diffFileLoc,
                "--revert"
        };
        p = Runtime.getRuntime().exec(cmd);
        if (p != null) {
            p.waitFor();
        }
        p.destroy();

关于java - 以编程方式从java调用Linux终端中的python脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34783507/

相关文章:

java - 如何在 Java 中获取 Javascript 变量值?

JAVA 10+ -XX :MaxRAMPercentage flag in Kubernetes container

python - 不重定向到动态 url

linux - 限制守护进程在 Linux 上打开某些端口

linux - Ansible 跳过我的标签

linux - GDB在远程调试期间挂起,库版本不匹配

java - Java中高效地将一个Json分割成多个Json字符串

python - 使用窗口函数时出现 pyspark 错误(Spark 2.1.0 报告未找到列的问题)?

python - Cython:使用类型化内存 View 时,Cython 用户是否应该实现他们自己的 "vector"函数库?

java - 如何使Java程序的多个实例共享同一个日志记录FileHandler?