12

lsJavaなどの 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) {}

何も起こらなかった。SENDに到達しましたが、その後停止しました...

シリアル ポートを使用するため、ルート権限が必要なスクリプトを実行しようとしています。また、いくつかのパラメーター (パケット) を含む文字列を渡す必要があります。

4

4 に答える 4

18

例のように PIPE を内部で使用することはできませんRuntime.getRuntime().exec()。PIPE はシェルの一部です。

あなたはどちらかを行うことができます

  • コマンドをシェルスクリプトに入れ、そのシェルスクリプトを.exec()またはで実行します
  • 次のようなことができます

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

@Alperの答えはうまくいくはずです。ただし、シェル スクリプトとリダイレクトをまったく使用しないことをお勧めします。(紛らわしい名前) を使用して、パスワードをプロセスの 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();
于 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 に答える