2013-09-25 4 views
1

У меня есть большой скрипт perl. Я хочу начать с моей java-программы. Я интенсивно искал в Интернете все возможности, и они ничего не помогли мне.Runtime.getRuntime(). Exec() скрипт perl в java 1.7

Я создал следующий скрипт java для запуска своего скрипта perl командной строки.

try { 
    String[] command = {"perl", "C:\\Users\\Rick\\Documents\\Perl\\InDelSub_finder_v0.2.0.pl"};//System.getProperty("user.dir")+"\\src\\InDelSub_finder_v0.2.0.pl", "-h"}; 
    String[] comm = {"-h"}; 
    System.out.println(Arrays.toString(command)); 
    System.out.println(Arrays.toString(comm)); 
    Process p = Runtime.getRuntime().exec(command, comm); 
    p.waitFor(); 
    try{ 
     BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line = null; 
     while ((line = in.readLine())!=null){ 
      System.out.println(line); 
     } 
    }catch(IOException e2){ 
     e2.printStackTrace(); 
    } 
    System.out.println("exitValue = " + p.waitFor()); 
} catch (IOException e1) { 
// TODO Auto-generated catch block 
    e1.printStackTrace(); 
} catch (InterruptedException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} 

Я пытался использовать String[] и String дать в exec(), но в конце концов оба не работают, он продолжает давать мне exitValue() = 255. Я также попробовал (как вы можете видеть в разделе комментариев), что я попробовал несколько способов доступа к правильному файлу, но это не то, что происходит не так. Я думаю, что это имеет какое-то отношение к тому, что по какой-то причине он не может открыть программу.

Может ли кто-нибудь помочь мне в этом? Я действительно потерялся в этом, и мне нужно, чтобы продолжить свою работу.

Большое спасибо за ваше время.

ответ

2

Вы используете неправильную подпись exec (которая с переменными окружения). Переместите свой массив -h на command.

Я думаю, что значение, возвращаемое из скрипта Perl, не зависит от способа его вызова из Java.

Чтобы убедиться, что ваш скрипт выполнен, просто попробуйте с помощью очень простого скрипта - вы можете написать что-то на диске, чтобы проверить, вызвано ли оно, и затем вы можете попробовать захватить некоторый вывод в stdout.

Имейте в виду, что p.waitFor() может вызвать тупик, так как выполнение команды может ждать, пока вы получите свой вывод на stdout и waitFor будет ждать окончания команды.

Проанализируйте PERL скрипт, чтобы выяснить, где она возвращает код 255.

Быстрое исследование дает мне информацию, что Perl завершает работу с кодом 255, когда die функция используется, - это может быть подсказка.

+0

Спасибо, что ответили на мой вопрос killer_PL, я попытался переместить -h также в массив команд, но это не сработало. (Я назвал небольшой скрипт, который возвращает только время, это действительно сработало.) Однако я не нашел нигде, что perl возвращает этот код с помощью функции 'die'. Большое вам спасибо за это, я могу работать с этим немного дальше. – RickBioinf

+0

Я серьёзно обязан вам одним мужчиной! Вы спасли меня. В моем скрипте perl есть функции 'die', которые вернули код 255. Я не понимал, что это произошло из моего перла, а не из моей java. – RickBioinf

+0

Не забудьте постоянно получать контент из запущенного процесса - сделайте исследование для этого. waitFor может просто повесить ваше приложение, если буфер вывода будет заполнен. –

Смежные вопросы