Запустите .py с вводом тестового примера txt и перенаправьте вывод в другой .txt - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь запустить команду из java, чтобы запустить файл Python (который я также создал в своем коде) с файлом тестового примера в качестве входа и перенаправить его вывод в другой файл .txt.Команда выглядит так: python < testCase1.txt > output.txt file.py И я пробовал также с абсолютным путем python < /home/mateus/IdeaProjects/coyote/testCase1.txt > /home/mateus/IdeaProjects/coyote/output.txt /home/mateus/IdeaProjects/coyote/file.py

Проблема, с которой я сталкиваюсь: после запуска этой команды с использованием ProcessBuilder вывод кода Python не перенаправляетсяв файл output.txt.Если я правильно запускаю из терминала Unix, он работает очень хорошо.

Я уже пробовал с Runtime.Exec () и ProcessBuilder.Я попытался использовать process.getInputStream (), но так как команда не возвращает информацию о терминале, она не работает.

public boolean runSourceCode() throws IOException {

    // creating py file
    Files.write( Paths.get(this.nameFile) , this.sourceCode.getBytes());

    // Creating the processbuilder
    Process p = new ProcessBuilder("python", String.format("< %s > %s %s", "./testCase1.txt", "./output.txt", String.format("./"+this.nameFile)) ).start();
}

РЕДАКТИРОВАТЬ 1 Итак, я исправился, что мне нужно сделать, это:

// running python
            ProcessBuilder p = new ProcessBuilder("python3" , namePyFile);
            p.redirectInput(new File( TestFiles.get(i) ) );
            p.redirectOutput(new File(saidaFileName));
            p.start().waitFor();

Также необходимо использовать `` `throws InterruptedException`` после подписи метода, потому что мы используем метод waitFor (), который будет ожидать запуска процесса.

1 Ответ

0 голосов
/ 16 июня 2019

Вы писали: Если я запускаю с терминала Unix, он работает ProcessBuilder - это не терминал UNIX. Вот почему у него есть метод redirectOutput , например. Старая статья, но все еще актуальная, на мой взгляд: Когда Runtime.exec () не будет . Вы можете заменить класс Runtime классом ProcessBuilder. На момент написания статьи класс ProcessBuilder не существовал.

...