2015-07-12 83 views
-1

我必須從maven項目運行一個python腳本。我使用main方法創建了一個臨時類,以檢查它是否按預期工作,使用了流程構建器,如果我指定了python腳本的絕對路徑,然後使用RUN作爲Java應用程序從eclipse運行java類,它將起作用。從maven運行一個外部python腳本

如果我改變它getClass()。getResourceAsStream(「/ scripts/script.py」),它會拋出一個異常,因爲它找不到python腳本。

什麼是放置python腳本的最佳場所,以及如何在Java類中訪問它而不指定完整路徑。由於我對maven很陌生,可能是由於用於執行Java程序的方法。

package discourse.apps.features; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import org.json.simple.JSONObject; 
import org.json.simple.parser.JSONParser; 
import org.json.simple.parser.ParseException; 



public class Test { 

protected String scriptPath = "/Users/user1/project1/scripts/script.py"; 
protected String python3Path = "/Users/user1/.virtualenvs/python3/bin/python3"; 


public static void main(String[] args) throws IOException { 
    new Test().score(); 
} 

public JSONObject score() { 
     String text1="a"; 
     String text2="b"; 
     JSONObject rmap =null; 

     try 
     { 

     String line= null; 
     String writedir=System.getProperty("user.dir")+ "/Tmp"; 
     String pbCommand[] = { python3Path, scriptPath,"--stringa", text1, "--stringb",text2,"--writedir", writedir }; 
     ProcessBuilder pb = new ProcessBuilder(pbCommand); 
     Process p = pb.start(); 

      InputStream is = p.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      while ((line = br.readLine()) != null) { 
       JSONParser parser = new JSONParser(); 
       rmap= (JSONObject) parser.parse(line); 
      } 

     } catch (IOException | ParseException ioe) { 
      System.err.println("Error running script"); 
      ioe.printStackTrace(); 
      System.exit(0); 
     } 

     return rmap; 
    } 
} 

這裏是從PB命令的輸出 pbCommand [0]:/用戶/用戶1/.virtualenvs/python3/bin中/ python3

pbCommand [1]:顯示完整的Python腳本

import os,sys 
from pyrouge import Rouge155 
import json 
from optparse import OptionParser 

def get_opts(): 
    parser = OptionParser() 
    parser.add_option("--stringa", dest="str_a",help="First string") 
    parser.add_option("--stringb", dest= "str_b",help="second string") 
    parser.add_option("--writedir", dest="write_dir", help="Tmp write directory for rouge") 

    (options, args) = parser.parse_args() 

    if options.str_a is None: 
     print("Error: requires string") 
     parser.print_help() 
     sys.exit(-1) 

    if options.str_b is None: 
     print("Error:requires string") 
     parser.print_help() 
     sys.exit(-1) 

    if options.write_dir is None: 
     print("Error:requires write directory for rouge") 
     parser.print_help() 
     sys.exit(-1)  

    return (options, args) 

def readTextFile(Filename): 
     f = open(Filename, "r", encoding='utf-8') 
     TextLines=f.readlines() 
     f.close() 
     return TextLines 

def writeTextFile(Filename,Lines): 
     f = open(Filename, "w",encoding='utf-8') 
     f.writelines(Lines) 
     f.close() 

def rougue(stringa, stringb, writedirRouge): 
    newrow={} 
    r = Rouge155() 
    count=0 
    dirname_sys= writedirRouge +"rougue/System/" 
    dirname_mod=writedirRouge +"rougue/Model/" 
    if not os.path.exists(dirname_sys): 
     os.makedirs(dirname_sys) 
    if not os.path.exists(dirname_mod): 
     os.makedirs(dirname_mod) 
    Filename=dirname_sys +"string_."+str(count)+".txt" 
    LinesA=list() 
    LinesA.append(stringa) 
    writeTextFile(Filename, LinesA) 
    LinesB=list() 
    LinesB.append(stringb) 
    Filename=dirname_mod+"string_.A."+str(count)+ ".txt" 
    writeTextFile(Filename, LinesB) 
    r.system_dir = dirname_sys 
    r.model_dir = dirname_mod 
    r.system_filename_pattern = 'string_.(\d+).txt' 
    r.model_filename_pattern = 'string_.[A-Z].#ID#.txt' 
    output = r.convert_and_evaluate() 
    output_dict = r.output_to_dict(output) 
    newrow["rouge_1_f_score"]=output_dict["rouge_1_f_score"] 
    newrow["rouge_2_f_score"]=output_dict["rouge_2_f_score"] 
    newrow["rouge_3_f_score"]=output_dict["rouge_3_f_score"] 
    newrow["rouge_4_f_score"]=output_dict["rouge_4_f_score"] 
    newrow["rouge_l_f_score"]=output_dict["rouge_l_f_score"] 
    newrow["rouge_s*_f_score"]=output_dict["rouge_s*_f_score"] 
    newrow["rouge_su*_f_score"]=output_dict["rouge_su*_f_score"] 
    newrow["rouge_w_1.2_f_score"]=output_dict["rouge_w_1.2_f_score"] 
    rouge_dict=json.dumps(newrow) 
    print (rouge_dict) 


def run(): 
    (options, args) = get_opts() 
    stringa=options.str_a 
    stringb=options.str_b 
    writedir=options.write_dir 
    rougue(stringa, stringb, writedir) 


if __name__ == '__main__': 
    run() 

pbCommand [2]: - stringa

pbCommand [3]:一個

pbCommand [4]: - stringb

pbCommand [5]:乙

pbCommand [6]: - writedir

pbCommand [7]:/用戶/用戶1/PROJECT1/TMP

回答

0

將腳本放在主/資源文件夾中,然後將其複製到目標文件夾。 然後確保你使用類似的com.google.common.io.Resources類,你可以用

<dependency> 
    <groupId>com.google.guava</groupId> 
    <artifactId>guava-io</artifactId> 
    <version>r03</version> 
</dependency> 

加那我有一個這樣的類,它有助於資源文件轉換爲字符串:

import java.net.MalformedURLException; 
import java.net.URI; 
import java.net.URL; 

import com.google.common.base.Charsets; 
import com.google.common.io.Resources; 

public class FileUtil 
{ 

    public static String convertResourceToString(URL url) 
    { 
     try 
     { 
      return Resources.toString(url, Charsets.UTF_8); 
     } 
     catch (Exception e) 
     { 
      return null; 
     } 
    } 

    public static String convertResourceToString(String path) 
    { 
     return convertResourceToString(Resources.getResource(path)); 
    } 

    public static String convertResourceToString(URI url) 
    { 
     try 
     { 
      return convertResourceToString(url.toURL()); 
     } 
     catch (MalformedURLException e) 
     { 
      return null; 
     } 
    } 

} 

一些建議,如果你正在學習maven嘗試使用它而不是IDE來運行和打包你的應用程序,那就是它應該做的。然後,一旦您確信應用程序將作爲打包的jar工作,那麼就使用IDE來運行它。

+0

其實這是一個很大的maven項目,我只是試圖運行一個單獨的類,它具有測試功能的主要功能。我將腳本添加到資源文件夾,如果我調試整個腳本更改爲一個字符串,但進程生成器不認爲這是一個可執行的Python腳本,它會拋出一個ecxeption – AMisra

+0

你可以打印出pbCommand []或什麼是actaully在進程生成器中執行,我建議在pbCommand []中執行「\」「+ scriptPath +」\「」。你也應該嘗試執行你的路徑變量中的腳本,並嘗試使用這個類來打印你的腳本來驗證它是否在正確的位置。 – Snickers3192