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

在Linux终端中以编程方式从java调用python脚本,java,python,linux,terminal,processbuilder,Java,Python,Linux,Terminal,Processbuilder,我正在开发一个Java应用程序,用于检查源文件中的补丁(如果有或没有)。检测修补程序更改的核心逻辑存在于python脚本[标题为'patch.py']中,我的Java应用程序与该python修补程序脚本通信,以检索操作的退出状态 python脚本可以从以下位置获得: 在windows中,它运行良好,但在Linux环境中。脚本本身没有从Java应用程序调用。我不确定哪里出了错 我使用“ProcessBuilder”调用python脚本,源代码如下: if (System.getProperty("

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

python脚本可以从以下位置获得:

在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------");
        }
if(System.getProperty(“os.name”).indexOf(“Windows”)!=-1){
ArrayList命令=新建ArrayList();
//如果平台为Windows,将启动Cmd提示符。
添加命令(“cmd”);
命令。添加(“/c”);
add(“python”);
add(“lib/patch.py”);
添加(“-d”);
add(auxSrcFile);
添加命令(diffFileLoc);
command.add(“--revert”);//切换以还原修补程序
pb=新的ProcessBuilder(命令);
}否则{
ArrayList命令=新建ArrayList();
//如果平台是Linux,则将启动xterm。
添加(“xterm”);
命令。添加(“-e”);
add(“python”);
add(“lib/patch.py”);
添加(“-d”);
add(auxSrcFile);
添加命令(diffFileLoc);
command.add(“--revert”);//切换以还原修补程序
pb=新的ProcessBuilder(命令);
}
如果(pb!=null){
p=pb.start();
如果(p!=null){
p、 waitFor();
}
}   
int exitStatus=p.exitValue();
如果(exitStatus==1){
System.out.println(“…OK”);
System.out.println(“----检测到补丁----”;
}否则{
System.out.println(“…错误”);
System.out.println(“----未找到修补程序-------”;
}
如果在Windows中运行Java应用程序,python脚本将被正确调用,而如果在Linux环境中运行应用程序,python脚本将失败

欢迎提出建议

注意:我可以独立运行“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();

这感觉像是路径问题,您确定正确管理了路径吗?您不应该使用带有斜杠的字符串,因为这是由不同的字符串处理的OSs@TimP:是的,我认为路径不应该是一个问题,因为在单机版中尝试运行相同的命令(使用“lib/patch.py”)时,我能够无任何问题地执行脚本。