2013-05-08 15 views
10

Mogę wykonywać polecenia systemu Linux, takie jak ls lub pwd z Java bez problemów, ale nie mogę wykonać skryptu w języku Python.Jak uruchomić skrypt Python z Java?

To jest mój kod:

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

Nic się nie stało. Osiągnięto SEND, ale po prostu przestał po nim ...

Próbuję wykonać skrypt, który potrzebuje uprawnień root, ponieważ używa portu szeregowego. Ponadto, muszę przekazać ciąg z pewnymi parametrami (pakiet).

+0

to Twój skrypt Pythona, który napisał coś na swój standardowy sposób? – VishalDevgire

+0

Co powiesz na użycie komendy Apache commons? – rkosegi

Odpowiedz

14

Nie można używać RURY wewnątrz Runtime.getRuntime().exec(), tak jak w swoim przykładzie. PIPE jest częścią powłoki.

Można to zrobić albo

  • Połóż polecenia skryptu powłoki i wykonać ten skrypt z .exec() lub
  • można zrobić coś podobnego do poniższego

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

Jak zrobić skrypt powłoki? Nigdy nie utworzyłem skryptu powłoki – Biribu

+2

Ta odpowiedź działa nawet bez tworzenia pliku skryptu powłoki. Po prostu skopiuj i wklej go do swojego kodu. – pts

+0

@pts Tak, działa, ale nie mogłem tego wcześniej wyraźnie wyjaśnić. Zaktualizowałem post, mam nadzieję, że teraz lepiej. – Alper

12

@ Odpowiedź Alpera powinna zadziałać. Jednak lepiej nie używać w ogóle skryptu powłoki i przekierowania. Możesz napisać hasło bezpośrednio do procesu 'stdin używając (zmyślnie nazwanego) 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

Czy to będzie działać zarówno z Windows, jak i Linux? –

+1

@ChinmayaB - tak, to jest agnostyka systemu operacyjnego. – jtahlborn

7

Zrobiłoby się gorzej niż spróbować embedding jython i wykonanie skryptu. Prosty przykład powinien pomóc:

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

Jeśli potrzebujesz dodatkowej pomocy, zostaw komentarz. Nie tworzy to dodatkowego procesu.

Powiązane problemy