Возвращать вывод Java Exec при предоставлении массива - PullRequest
0 голосов
/ 25 января 2019

Я использую java exec() для запуска некоторых системных команд * nix, в частности сценария python, но проблема носит более общий характер.

import java.io.*;

public class JRC {

    public static void main(String args[]) {
        String s[] = {"/bin/bash", "-c",
                 "source venv/bin/activate;python mergeExcel.py '/home/201811/'"};
        try{
            Process p = Runtime.getRuntime().exec(s);
        }
        catch (IOException e) {
                    System.out.println("exception: ");
                    e.printStackTrace();
        }
    }
}

Приведенный выше код работает в соответствии со степенью, в которой работает mergeExcel.py. Однако я не могу понять, как печатать на стандартный вывод из python.

Вот моя попытка, которая работает, только если мы exec() будем использовать простую строку, такую ​​как "ps -ef", а не массив строк, которые я использую.

try {
    Process p = Runtime.getRuntime().exec(s);

    BufferedReader stdInput = new BufferedReader(new
   InputStreamReader(p.getInputStream()));

    BufferedReader stdError = new BufferedReader(new
         InputStreamReader(p.getErrorStream()));

    while ((s = stdInput.readLine()) != null) {
        System.out.println(s);
    }
    while ((s = stdError.readLine()) != null) {
        System.out.println(s);
    }

    System.exit(0);
}

Это фактически приводит к ошибке компиляции несовместимых типов, java.lang.String вместо требуемого java.lang.String [].

Как я могу распечатать вывод команды source venv/.. и команды python?

1 Ответ

0 голосов
/ 25 января 2019

Благодаря комментатору легко объявить некоторые временные строки для печати из stdout и stderr, хотя, возможно, у другого пользователя есть более элегантное решение

    try {
        Process p = Runtime.getRuntime().exec(s);

        BufferedReader stdInput = new BufferedReader(new
             InputStreamReader(p.getInputStream()));

        BufferedReader stdError = new BufferedReader(new
             InputStreamReader(p.getErrorStream()));

        String stdi;
        while ((stdi = stdInput.readLine()) != null) {
            System.out.println(stdi);
        }

        String stderr;
        while ((stderr = stdError.readLine()) != null) {
            System.out.println(stderr);
        }
        System.exit(0);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...