2013-05-08 33 views
10

È possibile eseguire comandi Linux come ls o pwd da Java senza problemi, ma non è possibile eseguire uno script Python.Come eseguire lo script Python da Java?

Questo è il mio codice:

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) {} 

Non è successo niente. Ha raggiunto SEND ma si è appena fermato dopo di esso ...

Sto provando a eseguire uno script che richiede le autorizzazioni di root perché utilizza la porta seriale. Inoltre, devo passare una stringa con alcuni parametri (pacchetto).

+0

è il tuo script python che scrive qualcosa di diverso dal suo standard? – VishalDevgire

+0

Che ne dici di usare Apache commons exec? – rkosegi

risposta

14

Non è possibile utilizzare il PIPE all'interno di Runtime.getRuntime().exec() come nell'esempio. PIPE fa parte della shell.

Si potrebbe fare uno

  • Metti la tua comando per uno script di shell ed eseguire lo script shell con .exec() o
  • Si può fare qualcosa di simile a quanto segue

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

Come faccio a fare uno script di shell per quello? Non ho mai creato uno script di shell – Biribu

+2

Questa risposta funziona anche senza creare un file di script di shell. Basta copiarlo e incollarlo sul tuo codice. – pts

+0

@pts Sì, funziona ma non ho potuto spiegarlo chiaramente prima. Ho aggiornato il post, spero sia meglio ora. – Alper

12

@ La risposta di Alper dovrebbe funzionare. Meglio ancora, però, non usare affatto uno script di shell e il reindirizzamento. È possibile scrivere la password direttamente al processo 'stdin utilizzando il (con nome confuso) 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(); 
+0

Funzionerà con Windows e Linux? –

+1

@ChinmayaB - sì, questo è agnostico del sistema operativo. – jtahlborn

7

Si potrebbe fare di peggio che cercare embedding jython e l'esecuzione di script. Un semplice esempio dovrebbe aiutare:

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"); 

Se hai bisogno di ulteriore aiuto, lascia un commento. Questo non crea un processo aggiuntivo.

Problemi correlati