2016-08-29 10 views
1

私は、pythonライブラリでグラフを生成するgenerate_graphs.pyと呼ばれるpythonスクリプトを持っています。グラフは、内部データを使用して顧客に示す傾向です。Javaで複数のpythonスクリプトを実行しようとしています

私はJavaからスクリプトを実行しようとしていますが、実行中のエビデンスは表示されません。それが実行されたことを示すログの証拠はありませんが、これはスクリプト自体が実行されていないか、execメソッドの実装であるかどうかはわかりません。

スクリプトは、プロセスの一部としてデータをデータベースに挿入し、何も挿入されません。ただし、コマンドラインからスクリプトコマンドを個別に実行すると、スクリプトは正常に動作します。ここで

がmkyong.comから使用し、実行コマンドの実装です:

/** 
* 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()); 
} 

私だけを参照してください。

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(); 

} 

ここで大体一回3秒ごとに、合計で約40倍と呼ばれる方法がありますログ内の出力の部分はlog.debugです。私はそれをあまりにも早く/間違って呼んでいますか?どんな助けもありがとう、ありがとう!

+0

1. Javaコード規約では、camelCase(snake_caseではなく)を使用しています。 2.より良い方法は、['ProcessBuilder'](https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html)を使用することです。 – alfasin

答えて

関連する問題