Seite 1 von 1

Subprocess - Daten mitgeben / stdin.read überspringen

Verfasst: Freitag 5. Dezember 2008, 10:06
von Nergal
Hallo,

ich habe ein Problem mit der stdin Pipe bei dem Modul subprocess.

Ich habe ein Python Modul welches ein anderes Modul über einen subprocess startet und ihm über die stdin PIPE benötigte Daten mitgibt.

Danach möchte ich den subprocess steuern können; was soll er machen.
Ich habe schon an eine Austauschdatei gedacht, in die der Hauptprocess
etwas schreibt, was der subprocess ausliest. Diese Lösung ist aber sicher
nicht die eleganteste.

Deswegen wollte ich es über die stdin Pipe versuchen.
Allerdings kann ich nach process.stdin.close() keine Daten mehr über die Pipe schicken.
Außerdem scheint der subprocess die Daten nur beim Programmende
auszuwerten und nicht direkt nach dem Senden.
Deswegen habe ich quasi schon an selbstgemachte EOF Zeichen, wie eine Raute gedacht, weiß aber nicht ob das funktioniert.

Um das ganze zu verdeutliche, ein kleines Beispiel:

Code: Alles auswählen

# Hauptprocess  
    .
    . 
    Args = [Dictionary, Daten, nochMehrDaten]
    ArgsPickled = cPickle.dumps(Args)
    
    process = subprocess.Popen((sys.executable, "sub.py"), stdin = subprocess.PIPE) 
    
    # send arguments to the subprocess
    process.stdin.write(ArgsPickled)
    process.stdin.close()
    
    process.stdin.write("Connect")
    process.stdin.close()
    time.sleep(5)
    process.stdin.write("Start")
    process.stdn.close()
    .
    .

Code: Alles auswählen

# Subprocess
    import time
    import sys
    import cPickle
    
    def Start(self):
        return
    
    def Connect(self):
        return
    
    _Args = []
    
    if __name__ == "__main__":
        ArgsPickled = sys.stdin.read()
        Args = cPickle.loads(Temp)
        _Args = Args
        
        while True:
            Args = sys.stdin.read()
            if Args == "Connect":
                Connect()
            elif Args == "Start":
                Start()
            time.sleep(5)

Re: Subprocess Kommunikation über die stdin (mehrfach)

Verfasst: Freitag 5. Dezember 2008, 10:17
von gerold
Hallo Nergal!

http://www.python-forum.de/topic-4941.h ... ocess+pipe

Und was die Rückmeldung betrifft: Du kannst ein Python mit dem Parameter "-u" aufrufen, dann wird STDOUT nicht zwischengespeichert. Das heißt, dass du als erstes Argument die Python-Executable (sys.executable) und als zweites Argument "-u" in der Argumentenliste an ``supprocess.Popen`` übergeben musst. Siehe: http://www.python-forum.de/post-76334.html#76334

mfg
Gerold
:-)

Verfasst: Montag 8. Dezember 2008, 09:48
von Nergal
Kleine Planänderung, bei der ich aber vorher drei Sachen geklärt haben muss.

1. Ist es möglich, dem Subprocess gleich beim Anlegen Strings mitzugeben, in denen Daten enthalten sind?

2. Wenn ich nur die stdin und stdout nutzen will, ist es möglich, daß der Subprocess beim Lesen der stdin nicht immer wartet, bis jemand etwas in die Pipe geschrieben hat und erst dann weitermacht? Also nur lesen wenn was im Buffer steht und ansonsten das Lesen überspringen?

3. Kann ich eine Klasse in einem Python Modul als Subprocess aufrufen, ich weiß absolut nicht wie die Syntax da aussehen könnte?


Gruß
Nergal

Verfasst: Montag 8. Dezember 2008, 11:23
von mkesper
Nergal hat geschrieben: 3. Kann ich eine Klasse in einem Python Modul als Subprocess aufrufen, ich weiß absolut nicht wie die Syntax da aussehen könnte?
Ich glaube nicht, dass du das tun willst. subprocess wird benötigt, um ausführbare Programme, die nicht in Python erstellt sind, aufzurufen.
Module kann man importieren und dann enthaltene Klassen / Funktionen aufrufen.

EDIT: quoting geht nur in Vorschau...*puzzle*.

Verfasst: Montag 8. Dezember 2008, 11:31
von Nergal
Das bringt mir aber nichts wenn ich Programmteile als einen neuen Prozess starten will. Und da ich diese Programmteile ungern in ein seperates Modul auslagern möchte würd ich gerne wissen ob das geht.

Verfasst: Montag 8. Dezember 2008, 13:37
von mkesper
Processing sollte das können, was du möchtest.

Verfasst: Dienstag 9. Dezember 2008, 09:47
von Nergal
Danke, daß sieht genau nach dem aus was ich brauche :)