Popen-Problem

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
pto
User
Beiträge: 3
Registriert: Dienstag 16. Oktober 2007, 21:23

Hallo ich habe ein wenig mit Kinderprozessen experimentiert, und bin dabei auf folgendes Problem gestoßen:
Wenn man "gnuchess" im "engine-mode" (minimale Ausgabe nach xterm protokoll) startet, kann man nicht auf den stdout-Stream zugreifen.
Der Aufruf in der Konsole gibt beim Ausführen von "gnuchess -x" 2 Zeilen aus, theoretisch müsste das Lesen funktionieren. Allerdings bleibt der Interpreter beim Aufruf der "read()"-Methode stehen.

Beim Auslassen des Arguments "-x" funktioniert alles wie es sollte...
Testweise ließ ich stdout in eine Datei schreiben. An oberster Stelle standen die besagten 2 Zeilen, dannach folgten Massen von der gnuchess-spezifischen Fehlermeldung "Illegal Move". Damit diese aber ausgegeben wird müsste voher eine Eingabe erfolgen...

Hier der Code:

Code: Alles auswählen

import subprocess

cmd="gnuchess"
args="-x"
process = subprocess.Popen([cmd,args], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=0)
pout = process.stdout
pin = process.stdin

pout.read(1) #hier bleibt es stehen 

Ich bin für jeden Hinweis dankbar!
pug
User
Beiträge: 16
Registriert: Dienstag 4. September 2007, 17:00

Hallo pto,

ich vermute, das gnuchess die Meldungen nicht auf STDOUT sondern STDERR schreibt und du deshalb beim Lesen von STDOUT keine Rückgabe erhälst.

Probier doch mal STDERR zu lesen - die entsprechende Umleitung in eine Pipe hast Du ja schon.

Grüße
Pug
pto
User
Beiträge: 3
Registriert: Dienstag 16. Oktober 2007, 21:23

Diese Vermutung hatte ich auch... Ist aber leider nicht so... Das xboard-Protokoll schreibt vor die Befehle über STDIN und STDOUT zu senden. Ein Blick in den Quelltext von gnuchess hat auch nicht nähere Aufschlüsse darüber gegeben (alles schien "normal" zu sein)... Aber danke für den Hinweis!

edit: Vergessen... STDERR ist leer, das hätte ich vielleicht vorher erwähnen sollen...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo pto!

Wenn dein Programm beim Lesen aus stdout stehen bleibt, dann schickt gnuchess einfach nichts über stdout raus. Vielleicht genügt es ja schon, **zuerst** etwas an stdin zu schreiben.

Code: Alles auswählen

import subprocess

cmd="gnuchess"
args="-x"
process = subprocess.Popen([cmd, args], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pout = process.stdout
pin = process.stdin
perr = process.stderr

pin.write("Hallo Welt\n")
print pout.read()
print perr.read()
Einen Versuch ist es sicher wert. Vielleicht auch mal ohne stderr. Dann musst du aber auch stderr aus Popen raus nehmen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten