Seite 1 von 1

subprocess: Brauche Tipp

Verfasst: Freitag 20. März 2009, 19:27
von 10111
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.

Verfasst: Freitag 20. März 2009, 20:43
von 10111
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()

Verfasst: Samstag 21. März 2009, 08:56
von Leonidas

Code: Alles auswählen

p = Popen(['python', 'sub.py'], stdin=PIPE, stdout=PIPE)
Wobei ``p`` jetzt nicht so der optimale Name ist.

Verfasst: Sonntag 22. März 2009, 21:31
von 10111
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.