subprocess: Brauche Tipp

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
10111
User
Beiträge: 22
Registriert: Samstag 21. Februar 2009, 01:34

Hallo liebes Forum!

Z.Zt. experimentiere ich mit dem Modul subprocess. Ich möchte eine Kommunikation mit dem aufgerufenen Programm über stdin/stdout machen (so wie bei gnuChess). Aber leider scheint da noch ein Logikfehler zu sein, denn ich bekomme manchmal die Rückgabe verzögert. Ich poste mal die Scripte und die Ausgabe. Vielleicht kann mir ja jemand helfen?!

Code: Alles auswählen

#! /usr/bin/python
# main.py

from subprocess import Popen, PIPE
import time
import sys

p = Popen('python sub.py', shell=True, stdin=PIPE, stdout=PIPE)

while True:
    s_in = raw_input('> ')
    print '>>> '+s_in
    p.stdin.write(s_in+'\n')
    p.stdin.flush()
    s_out = ''
    while not s_out:
        s_out = p.stdout.readline()
    sys.stdout.write(s_out)

Code: Alles auswählen

#! /usr/bin/python
# sub.py

import sys

while True:
    s_in = sys.stdin.readline()
    if s_in != '':
        s_out = 'Sub: ' + s_in + '\n'
        sys.stdout.write(s_out)
        sys.stdout.flush()

Code: Alles auswählen

> fdsfda
>>> fdsfda
Sub: fdsfda
> fsdfdfdsfsd
>>> fsdfdfdsfsd

> 34
>>> 34
Sub: fsdfdfdsfsd
> 
Erklärung zur Ausgabe: ">" ist die Eingabe. ">>>": die Eingabe nochmal zur Kontrolle. "Sub: ...": das gibt der Subprocess zurück.
10111
User
Beiträge: 22
Registriert: Samstag 21. Februar 2009, 01:34

Also ich hab den Fehler doch noch gefunden. Hatte in "sub.py" ein "\n" zu viel (hatte dann 2 "\n" gesendet in Zeile 9). Ich poste noch mal die Scripte, womit es jetzt funktioniert. Ist natürlich noch ausbausfähig. :)

Code: Alles auswählen

#! /usr/bin/python
# main.py

from subprocess import Popen, PIPE
import sys

p = Popen('python sub.py', shell=True, stdin=PIPE, stdout=PIPE)

while True:
    s_in = raw_input('> ')
    print '>>> '+s_in
    p.stdin.write(s_in+'\n')
    s_out = p.stdout.readline()
    sys.stdout.write(s_out)

Code: Alles auswählen

#! /usr/bin/python
# sub.py

import sys

while True:
    s_in = sys.stdin.readline()
    s_out = 'Sub: ' + s_in
    sys.stdout.write(s_out)
    sys.stdout.flush()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Code: Alles auswählen

p = Popen(['python', 'sub.py'], stdin=PIPE, stdout=PIPE)
Wobei ``p`` jetzt nicht so der optimale Name ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
10111
User
Beiträge: 22
Registriert: Samstag 21. Februar 2009, 01:34

Danke für den Tipp mit der Liste. Offensichtlich brauche ich auch kein "shell=True". Hatte aber vorher nur mit funktioniert.

Dass "p" kein toller Name ist, ist irgendwie klar. Nur wenn ich schnell etwas teste, dann halte ich mich nicht mit langen Namen auf. Bei der größe der Test-Skripte ist das auch kein Problem.
Antworten