2017-07-22 74 views
0

目前我能够使用Process以java启动python程序。从Java运行python脚本时找不到mvn命令

问题是,Process在python程序中无法识别mvn命令,虽然我已经安装了maven并且能够从终端运行python程序。

这是我如何使用Process

public static String runCommand(String directory, List<String> command) { 

    ProcessBuilder processBuilder = new ProcessBuilder(command).directory(new File(directory)); 

    processBuilder.redirectErrorStream(true); 

    Process process; 
    String output = null; 
    try { 
     process = processBuilder.start(); 


     //Pause the current thread until the process is done 
     process.waitFor(); 

     //When the process does not exit properly 
     if (process.exitValue() != 0) { 

      //Error 
      System.out.println("command exited in error: " + process.exitValue()); 

      //Handle the error 
      return readOutput(process); 
     }else { 

      output = readOutput(process); 
      System.out.println(output); 
     } 

    } catch (InterruptedException e) { 
     System.out.println("Something wrong with command: " +e.getMessage()); 

    } catch (IOException e) { 
     System.out.println("Something wrong with command: " +e.getMessage()); 
    } 

    return output; 
}` 

驱动程序代码:

List<String> csi = new ArrayList<>(); 
    CSI_PATH = getClass().getResource("/python/csi").getPath(); 
    System.out.println("CSI path:" + CSI_PATH); 


    //Construct the argument 
    csi.add(CSI_PATH); 
    //argument for the csi program 
    csi.add(pre_hash); 
    csi.add(post_hash); 

    String csi_output = Command.runCommand(project_directory, csi); 

    System.out.println(csi_output); 

有什么我可以用Java做让Process承认mvn Python程序里面? CSI计划的

相关部分:

os.sys_call("git checkout " + commit_hash) 
os.sys_call("mvn clean") 
bin_path = mvn.path_from_mvn_call("outputDirectory") 
src_rel_path = mvn.path_from_mvn_call("sourceDirectory") 


def path_from_mvn_call(env): 
    if env not in ["sourceDirectory", "scriptSourceDirectory", "testSourceDirectory", 
       "outputDirectory", "testOutputDirectory", "directory"]: 
     raise ValueError("incorrect env var: " + env) 
    mvn_cmd = "mvn help:evaluate -Dexpression=project.build." + env + " | grep ^/" 
    return subprocess.check_output(mvn_cmd, shell=True).strip() 

def sys_call(cmd, ignore_bad_exit=False): 
    ret = subprocess.call(cmd, shell=True) 
    if ret != 0: 
     print "\n-- << non-zero exit status code >> --" 
     if ignore_bad_exit: 
      print "Exit from command: \n\t" + cmd 
      print "But we can safely ignore such non-zero exit status code this time.\n" 
     else: 
      print "Error in command: \n\t" + cmd + "\n" 
      raise SystemExit("system exit: " + str(ret)) 

Thx提前!

编辑: 我已经试过这个帖子 How do I launch a java process that has the standard bash shell environment?

所以我改变了代码

 //Construct the argument 
     csi.add("/bin/bash"); 
     csi.add("-l"); 
     csi.add("-c"); 
     csi.add("\"" + csi_path + " " + pre_hash+ " " + post_hash + "\""); 
     String csi_output = Command.runCommand(project_directory, csi); 

但即便如此由127命令退出,这意味着Value 127 is returned by your shell /bin/bash when any given command within your bash script or on bash command line is not found in any of the paths defined by PATH system environment variable.

如果我运行/bin/bash -l -c "mvn --version"在java中,它仍然退出127.

+0

请出示一些相关的代码。 – OldProgrammer

+0

@OldProgrammer Thx的提醒,我已经添加了相关的代码。 –

回答

-1

Pytho n从终端继承所有环境。 Python生成的子进程应该继承父进程的所有环境。所以我不知道为什么错误发生mvn。 你可以尝试蟒子:

import subprocess 
args = ['mvn', '-version'] 
process = subprocess.Popen(args, stdout=subprocess.PIPE) 

import subprocess 
args = ['mvn', '-version'] 
process = subprocess.Popen(args,shell=True)