2016-08-29 3 views
1

Ich habe ein Python-Skript namens generate_graphs.py, das Graphen mit Python-Bibliotheken generiert. Die Grafiken sind Trends, die wir unseren Kunden mit unseren internen Daten zeigen.Ich versuche, mehrere Python-Skripte in Java auszuführen

Ich versuche, das Skript von Java auszuführen, aber ich sehe keinen Beweis dafür, dass es ausgeführt wird. Es gibt keinen Hinweis auf Protokolle, die es ausführen, aber ich bin mir nicht sicher, ob dies das Skript selbst ist, oder ob es die Implementierung der Exec-Methode ist.

Das Skript fügt Daten in eine Datenbank als Teil seines Prozesses ein und es wird nichts eingefügt. Wenn Sie den Skriptbefehl jedoch separat über die Befehlszeile ausführen, wird das Skript einwandfrei ausgeführt.

Hier ist der Befehl Implementierung von mkyong.com verwendet ausführen:

private String executeCommand(String command) { 

    StringBuffer output = new StringBuffer(); 

    Process p; 
    try { 
     p = Runtime.getRuntime().exec(command); 
     p.waitFor(); 
     BufferedReader reader = 
       new BufferedReader(new InputStreamReader(p.getInputStream())); 

     String line = ""; 
     while ((line = reader.readLine())!= null) { 
      output.append(line + "\n"); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return output.toString(); 

} 

Hier ist die Methode, die etwa 40 Mal insgesamt genannt wird, etwa einmal alle 3 Sekunden:

/** 
* Runs a command to execute the generate_graph python script 
* 
* @param server_id 
*/ 
public void generateGraph(List<String> list_name, String server_id, String email_addr, String report_str) { 

    String generate_graph_cmd = "python2.7 generate_graphs.py --l '%s' --server_name '%s' --email_addr '%s' --report_string '%s' --debug"; 
    //We want to remove the lm_ part from the server name 
    String server_name = server_id.split("_")[1].replace("\'", ""); 
    String list_name_str = ""; 

    for (String name : list_name){ 
     list_name_str += name + ","; 
    } 
    //We want to remove the trailing comma left by the above loop 
    if (list_name_str.length() > 1){ 
     list_name_str = list_name_str.substring(0, list_name_str.length() - 1); 
    } 


    generate_graph_cmd = String.format(generate_graph_cmd, list_name_str, server_name, email_addr, report_str); 

try { 

    System.out.println("[Py Output] " + executeCommand(generate_graph_cmd)); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    log.debug("Generating graph with the following parameters:\nserver_id: " + server_id + "\nlist_id: " + list_name.toString()); 
} 

ich nur sehen der log.debug Teil der Ausgabe in den Protokollen. Rufe ich es zu schnell/falsch? Jede Hilfe wäre willkommen, danke!

+0

1. Die Java-Code-Konvention verwendet camelCase (nicht snake_case). 2. Eine bessere Vorgehensweise ist die Verwendung von [ProcessBuilder] (https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html) – alfasin

Antwort

Verwandte Themen