如何从Java执行Python脚本(通过命令行)?

2022-09-05 00:30:40

我可以毫无问题地执行像Java或从Java一样的Linux命令,但无法执行Python脚本。lspwd

这是我的代码:

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权限的脚本,因为它使用串行端口。另外,我必须传递一个带有一些参数(数据包)的字符串。


答案 1

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

你可以做任何一件事

  • 将命令放入 shell 脚本,然后使用 或 执行该 shell 脚本.exec()
  • 您可以执行类似于以下内容的操作

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

答案 2

@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();