Subprocess - Daten mitgeben / stdin.read überspringen

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
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

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)
Zuletzt geändert von Nergal am Montag 8. Dezember 2008, 09:47, insgesamt 1-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

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
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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*.
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

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.
Zuletzt geändert von Nergal am Montag 8. Dezember 2008, 22:25, insgesamt 1-mal geändert.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Processing sollte das können, was du möchtest.
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Danke, daß sieht genau nach dem aus was ich brauche :)
Antworten