Java для передачи args скрипту Python

ПРИМЕЧАНИЕ. Путь python.exe уже установлен.

Я пытаюсь создать программу Java, которая передает переменную args (или любую другую переменную) в сценарий Python.

import java.io.*;

public class PythonCallTest{

 public static void main (String[] args){
 String s = null;

 Runtime r = Runtime.getRuntime();
 try{
 Process p = r.exec("cmd /c python ps.py+",args);

 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);
 }
 catch(IOException ioe){
 ioe.printStackTrace();
 System.exit(-1);
 }
 }
}

Программа компилируется, но когда я запускаю ее с помощью

java PythonCallTest sender-ip=10.10.10.10

Я получаю ошибку

"python" не распознается как внутренняя или внешняя команда, операционная программа или командный файл.

Как правильно конкатенировать строку в r.exec("cmd/c python ps. py+", args)

РЕДАКТИРОВАТЬ

Если я выполню следующие

Process p = r.exec("cmd /c python ps.py sender-ip=10.251.22.105");

Затем программа работает. Путь для python.exe уже установлен. Мне просто нужно знать, как добавить args в r.exec, то есть как объединить cmd/c python ps.py с args

1 ответ

Вы передаете args в качестве второго аргумента Runtime.exec(...).

Это переопределяет стандартную (унаследованную) среду нового процесса как бесполезную, и, следовательно, переменная Path больше не содержит путь к python.exe.

Вы должны использовать эту версию Runtime.exec(...):

public Process exec(String[] cmdarray);

Что бы вы сделали так:

public static void main(String[] args) {
 ...

 List<string> process_args = new ArrayList<string>(Arrays.asList("cmd", "/c", "python", "ps.py"));
 process_args.addAll(Arrays.asList(args));

 Runtime r = Runtime.getRuntime();
 try {

 Process p = r.exec(process_args.toArray(new String[] {}));
 ...
 } catch (IOException e) {
 ...
 }
}
</string></string>

licensed under cc by-sa 3.0 with attribution.