12

ls我可以毫无问题地执行类似 Java或来自 Java 的Linux 命令pwd,但无法执行 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) {}

没啥事儿。它到达了发送,但它在它之后就停止了......

我正在尝试执行一个需要 root 权限的脚本,因为它使用串行端口。另外,我必须传递一个带有一些参数(数据包)的字符串。

4

4 回答 4

18

您不能Runtime.getRuntime().exec()像在示例中那样使用 PIPE 。PIPE 是外壳的一部分。

你可以做

  • 将您的命令放入 shell 脚本并使用.exec()or执行该 shell 脚本
  • 您可以执行类似于以下的操作

    String[] cmd = {
            "/bin/bash",
            "-c",
            "echo password | python script.py '" + packet.toString() + "'"
        };
    Runtime.getRuntime().exec(cmd);
    
于 2013-05-08T18:26:31.550 回答
12

@Alper 的回答应该有效。不过,更好的是,根本不要使用 shell 脚本和重定向。您可以使用 (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();
于 2013-05-08T18:59:49.760 回答
7

您会比尝试嵌入 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");

如果您需要进一步的帮助,请发表评论。这不会创建额外的进程。

于 2013-05-08T19:36:44.823 回答
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);
于 2019-10-22T13:44:37.957 回答