Java Program aus Python-Script starten mit Output Umleitung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LazyBall
User
Beiträge: 3
Registriert: Donnerstag 2. Juli 2009, 12:20

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!
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

[mod]subprocess[/mod]
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Es gibt übrigens [code=py][/code]
LazyBall
User
Beiträge: 3
Registriert: Donnerstag 2. Juli 2009, 12:20

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
LazyBall
User
Beiträge: 3
Registriert: Donnerstag 2. Juli 2009, 12:20

Danke Habs auch grad gesehen ;-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Änder mal Zeile 5 zu

Code: Alles auswählen

while not retval:
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.
Antworten