我可以毫无问题地从Java执行ls
或pwd
等Linux命令,但无法执行Python脚本。
这是我的代码:
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但它刚刚停止......
我正在尝试执行需要root权限的脚本,因为它使用串行端口。另外,我必须传递带有一些参数(包)的字符串。
答案 0 :(得分:17)
您不能像在示例中那样使用Runtime.getRuntime().exec()
内的PIPE。 PIPE是shell的一部分。
你可以做任何一件事
.exec()
或您可以执行与以下内容类似的操作
String[] cmd = {
"/bin/bash",
"-c",
"echo password | python script.py '" + packet.toString() + "'"
};
Runtime.getRuntime().exec(cmd);
答案 1 :(得分:12)
@ Alper的答案应该有效。但更好的是,根本不使用shell脚本和重定向。您可以直接将密码写入流程' stdin使用(容易混淆的名称)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();
答案 2 :(得分:7)
你会比尝试embedding jython并执行你的脚本更糟糕。一个简单的例子应该有所帮助:
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");
如果您需要进一步的帮助,请发表评论。这不会创建额外的过程。
答案 3 :(得分:0)
首先,打开终端并输入“ which python3”。您将获得python3的完整路径。例如“ / usr / local / bin / python3”
String[] cmd = {"/usr/local/bin/python3", "arg1", "arg2"};
Process p = Runtime.getRuntime().exec(cmd);
p.waitFor();
String line = "", output = "";
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = br.readLine())!= null) {sb = sb.append(line).append("\n"); }
output = sb.toString();
System.out.println(output);