Seite 1 von 1

Popen-Problem

Verfasst: Dienstag 16. Oktober 2007, 22:02
von pto
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!

Verfasst: Mittwoch 17. Oktober 2007, 21:26
von pug
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

Verfasst: Freitag 19. Oktober 2007, 01:21
von pto
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...

Verfasst: Freitag 19. Oktober 2007, 07:46
von gerold
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
:-)