Создание процесса с помощью ProcessBuilder из сценария .py? [дубликат]JAVA

Программисты JAVA общаются здесь
Anonymous
Создание процесса с помощью ProcessBuilder из сценария .py? [дубликат]

Сообщение Anonymous »

В рамках курсовой работы мне нужно использовать ProcessBuilder для моделирования планировщика процессов ОС, используя сценарии Python в качестве процессов. Проблема в том, что я не могу заставить свой ProcessBuilder распознать .py как действительный файл приложения.
  • Когда я пробую указать путь к файлу сам по себе, т. е. ... = new ProcessBuilder(processPath);, я получаю исключение IOException, сообщающее мне, что файл не является допустимым приложением Win32.
  • Когда я пытаюсь проследить путь к файлу с помощью Аргумент "python" - т.е. new ProcessBuilder(processPath, "python"); ИЛИ new ProcessBuilder(List.of(processPath, "python")); - происходит то же самое.
  • Когда я пытаюсь предварить путь к файлу словом "python" (как это наиболее распространенное форматирование, встречающееся в других вопросах о переполнении стека по этой теме), программа вместо этого пытается и не удается найти файл приложения с именем "python"!
У меня недостаточно опыта для дальнейшей диагностики проблемы, кроме проверки того, что используемый путь к файлу, передаваемый в функцию с помощью параметра, на самом деле правильный (и это так; я нашел предварительно написанный код, который создает соответствующий .py во время выполнения, помещает его в каталог @tempdir и отправляет путь к файлу).

РЕДАКТИРОВАНИЕ:
Вот соответствующий код:

Код: Выделить всё

@Override
public void run() {
System.out.println("Working Directory = " + PCB.getProcessPath()); // debug print;
running = true;
PCB.callState("running");

ProcessBuilder Build = new ProcessBuilder("python", PCB.getProcessPath());
Process prcss = null;

try {
prcss = Build.start();
prcss.waitFor();
}
catch (InterruptedException | IOException e) {
PCB.callState("interrupted!"); // debug print;
e.printStackTrace();
}

String output = prcss.getInputStream().toString();

PCB.setPCBResult(output);
System.out.println("Output: " + output);

running = false;
PCB.callState("finished");
}
Обратите внимание на следующее:
  • PCB — это экземпляр специального заранее написанного класса ProcessControlBlock, который мы должны использовать.
  • CallState() — это созданный мной собственный удобный метод, который просто устанавливает, а затем печатает статус печатной платы.
  • Нам рекомендуется использовать ProcessBuilder вместо RunTime.exec(); Я не думаю, что это обязательно, но я немного не в курсе, поэтому стараюсь следовать рекомендациям.

Вернуться в «JAVA»