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

subprocess: Brauche Tipp

Beitragvon 10111 » Freitag 20. März 2009, 19:27

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=]> fdsfda
>>> fdsfda
Sub: fdsfda
> fsdfdfdsfsd
>>> fsdfdfdsfsd

> 34
>>> 34
Sub: fsdfdfdsfsd
> [/code]
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

Beitragvon 10111 » Freitag 20. März 2009, 20:43

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()
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 21. März 2009, 08:56

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

Beitragvon 10111 » Sonntag 22. März 2009, 21:31

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.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]