Как выполнить Python script с Java?

Я могу выполнять команды Linux, такие как ls или pwd, из Java без проблем, но не смог выполнить Python script.

Это мой код:

Process p;
try{
    System.out.println("SEND");
    String cmd = "/bash/bin -c echo password| python script.py '" + packet.toString() + "'";
    //System.out.println(cmd);
    p = Runtime.getRuntime().exec(cmd); 
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String s = br.readLine(); 
    System.out.println(s);
    System.out.println("Sent");
    p.waitFor();
    p.destroy();
} catch (Exception e) {}

Ничего не случилось. Он достиг SEND, но он просто остановился после него...

Я пытаюсь выполнить script, которому нужны права root, потому что он использует последовательный порт. Кроме того, я должен передать строку с некоторыми параметрами (пакетом).

Ответ 1

Вы не можете использовать PIPE внутри Runtime.getRuntime().exec(), как в своем примере. PIPE является частью оболочки.

Вы можете сделать либо

  • Поместите свою команду в оболочку script и выполните эту оболочку script с помощью .exec() или
  • Вы можете сделать что-то похожее на следующие

    String[] cmd = {
            "/bin/bash",
            "-c",
            "echo password | python script.py '" + packet.toString() + "'"
        };
    Runtime.getRuntime().exec(cmd);
    

Ответ 2

@Ответ должен работать. Однако еще лучше не использовать оболочку script и перенаправление вообще. Вы можете написать пароль непосредственно к процессу 'stdin, используя (confusingly named) Process.getOutputStream().

Process p = Runtime.exec(
    new String[]{"python", "script.py", packet.toString()});

BufferedWriter writer = new BufferedWriter(
    new OutputStreamWriter(p.getOutputStream()));

writer.write("password");
writer.newLine();
writer.close();

Ответ 3

Вы бы сделали хуже, чем попробовать встраивание jython и выполнить ваш script. Простой пример должен помочь:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");

// Using the eval() method on the engine causes a direct
// interpretataion and execution of the code string passed into it
engine.eval("import sys");
engine.eval("print sys");

Если вам нужна дополнительная помощь, оставьте комментарий. Это не создает дополнительный процесс.