Как выполнить 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");
Если вам нужна дополнительная помощь, оставьте комментарий. Это не создает дополнительный процесс.