2017-07-22 93 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)