Seite 1 von 1

Java Program aus Python-Script starten mit Output Umleitung

Verfasst: Donnerstag 2. Juli 2009, 12:35
von LazyBall
Hallo,

ich muss aus einem Pythonscript ein Java Programm starten, ich möchte aber, sobald im Java-Prog ein System.out.print erfolgt die Ausgabe im Outputfenster meines Python Scripts sehen.
Momentan sieht meine Lösung so aus:
cmd = javaExe+' '+r'-jar transformation.jar configuration.xml '+ outfile + r' ' + infile
for line in os.popen(cmd).readlines():
<tab>print line

Problem, die Ausgabe des Java-Progs wird erst nach Beendigung des Java-Programmes im Python Output angezeigt. Ich benötige die Java-Outputs aber on-the-fly, da das Programm relativ lange läuft und Zwischenergebnisse ausgibt.


Kleiner Nachtrag ich bin an Python 2.5.1 gebunden und ich möchte kein Konsolenfenster (vom Java Programm) sehen während der Ausführung des Jars.

Gibt es dafür eine Lösung?

Bin für jede Hilfe dankbar!

Verfasst: Donnerstag 2. Juli 2009, 12:46
von Rebecca
[mod]subprocess[/mod]

Verfasst: Donnerstag 2. Juli 2009, 13:03
von cofi
Es gibt übrigens [code=py][/code]

Verfasst: Donnerstag 2. Juli 2009, 14:03
von LazyBall
Danke

..Falls jemand das gleiche Problem hat, hier meine Lösung:

Basierend auf diesem Post erstellt:
http://mail.python.org/pipermail/python ... 02732.html

Code: Alles auswählen

import subprocess
proc = subprocess.Popen([javaExe,"-jar","transformation.jar","configuration.xml",outfile, pyfile], cwd =jarWorkdir,stdin=subprocess.PIPE, stdout = subprocess.PIPE, stderr =subprocess.STDOUT, shell = True)	
retval= None
while retval == None:
   line = proc.stdout.readline()
   print line.rstrip()
   retval=proc.poll()	
Klappt super..

PS. Danke an Rebecca

Verfasst: Donnerstag 2. Juli 2009, 14:06
von LazyBall
Danke Habs auch grad gesehen ;-)

Verfasst: Donnerstag 2. Juli 2009, 14:07
von cofi
Änder mal Zeile 5 zu

Code: Alles auswählen

while not retval:

Verfasst: Donnerstag 2. Juli 2009, 14:22
von BlackJack
@LazyBall: Das `retval` kann man sogar ganz weglassen, denn wenn das nicht mehr `None` ist, dann *muss* auch `proc.stdout` am Ende sein. Also reicht eine einfache Schleife über `proc.stdout`. Und vielleicht nach der Schleife ein Aufruf von `proc.wait()`.

Das ``shell=True`` sollte aus dem Aufruf von `Popen` noch raus. Die Shell dazwischen ist überflüssig.