2012-03-27 3 views
0

Ich stelle ein mehrsprachiges System zusammen, stoße aber auf Probleme mit verwaisten Prozessen.Schließen Java-Subprozess beim Aufruf von Programmen beendet/stürzt ab

Mein Code besteht aus einem Python-Programm, das ein Java-Programm aufruft, mit piped Kommunikation zwischen den beiden Programmen; Das Java-Programm ist persistent, nicht nur ein einmaliger Lauf. Alles funktioniert im Allgemeinen, aber ich muss das Java-Programm schließen, wenn das Python-Programm vorzeitig beendet wird.

Ich denke der beste Weg, dies zu tun, ist das Java-Programm zu haben, sich zu schließen, wenn es nicht das stdin Rohr zwischen den Programmen erkennen kann, aber ich kann nicht herausfinden, dies zu tun.

Relevante Python-Code:

javaInterface = subprocess.Popen(["pathtojavaprogram"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

Relevante Java-Code; Ich mag das Programm beenden, wenn es nicht von stdin lesen kann, aber ich denke, dass einige blockierenden Probleme mit der readline() Funktion kommen ins Spiel:

String stdinStr = ""; 
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); 

while(true){ 
    try{ 
     stdinStr = stdin.readLine(); 
    } 
    catch(java.lang.Exception e){ 
     System.exit(0); 
    } 
    //Do stuff with the stdinStr data 
} 
+0

Scheint wie ein vernünftiger Ansatz. Die unterbrochene Pipe kann nur zu einem EOF in der Java-Prozess-stdin führen. Das Javadoc für readLine() sagt, es gibt null auf EOF zurück - hast du versucht, stdinStr nur für null zu prüfen, anstatt Ausnahme zu fangen? – Alex

+0

Haben Sie versucht, das Python-Programm vorzeitig beenden zu lassen? Bleibt der Java-Prozess mit diesem Code am Leben? – trutheality

+0

Alex: Die Überprüfung auf null hat es definitiv repariert; vielen Dank. Ich habe das im Javadoc total vermisst ... Ich nahm an, dass es eine Ausnahme geworfen hat und nicht null zurückgegeben wurde. Fühlen Sie sich frei, dies als Antwort zu posten, damit ich es als beantwortet markieren kann. – Shookit

Antwort

0

Dies wurde in den Kommentaren von trutheality beantwortet, aber Ich wollte dies als beantwortet markieren.

Die Funktion readLine() gibt immer null zurück, wenn die Pipe beendet wird. Wenn Sie nach dieser Option suchen, können Sie den Subprozess ordnungsgemäß schließen.

+0

Das hat super funktioniert, danke für deine Hilfe. – Shookit

Verwandte Themen