2009-07-06 13 views
4

Ich muss einen externen Prozess starten, der über Nachrichten gesteuert werden soll, die über stdin und stdout hin- und hergeschickt werden. Mit subprocess.Popen kann ich den Prozess starten, aber ich kann die Ausführung nicht wie gewünscht über stdin steuern.Starten und Steuern eines externen Prozesses über STDIN/STDOUT mit Python

Die Strömung von dem, was ich versuche, zu vollenden ist: der externen Prozess

  1. Starten Sie den externen Prozess
  2. Iterate für eine bestimmte Anzahl von Schritten
    1. Sagen Sie die nächste Verarbeitung abzuschließen Schritt durch Schreiben eines neuen Zeilenzeichens in die Standardeingabe
    2. Warten Sie, bis der externe Prozess signalisiert, dass der Schritt abgeschlossen ist, indem Sie ein neues Zeilenzeichen in den stdout
    3. schreiben
  3. Schließen Sie die Standardeingabe des externen Prozesses, um dem externen Prozess anzuzeigen, dass die Ausführung abgeschlossen ist.

    process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE); 
    for i in xrange(StepsToComplete): 
        print "Forcing step # %s"%i 
        process.communicate(input='\n') 
    

    Wenn ich führen Sie den obigen Code der ‚\ n‘ ist nicht auf den externen Prozess mitgeteilt, und ich nie über Schritt # 0 erhalten:

Ich habe mit den folgenden so weit kommen . Der Code blockiert bei process.communicate() und geht nicht weiter. Ich verwende die Methode communicate() falsch?

Wie würde ich auch die Funktion "Warten, bis der externe Prozess eine neue Zeile schreibt" implementieren?

Antwort

8

process.communicate (Eingabe = '\ n') ist falsch. Wenn Sie in den Python-Dokumenten feststellen, dass die Zeichenfolge in die Standardsprache des untergeordneten Elements geschrieben wird, werden alle Ausgaben vom untergeordneten Element gelesen, bis das untergeordnete Element beendet wird. Von doc.python.org:

Popen.communicate (Eingang = None) Interact mit Prozess: Senden von Daten an stdin. Lesen Sie Daten von stdout und stderr, bis End-of-File erreicht ist. Warten Sie auf Prozess zu beenden. Das optionale Eingabeargument sollte eine Zeichenfolge an sein, die an den untergeordneten Prozess gesendet werden soll, oder an Keines, , wenn keine Daten an das untergeordnete Element gesendet werden sollen.

Stattdessen möchten Sie nur in die Standardsprache des Kindes schreiben. Dann lies daraus in deiner Schleife.

Etwas mehr wie:

process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE); 
for i in xrange(StepsToComplete): 
    print "Forcing step # %s"%i 
    process.stdin.write("\n") 
    result=process.stdout.readline() 

Dieses etwas tun wird, mehr wie das, was Sie wollen.

+3

Etwas, das mich bei der ersten Sache gebissen hat, war, dass wenn Sie nur ein paar Zeichen senden, müssen Sie möglicherweise die Streams spülen, bevor etwas übertragen wird. – Kiv

Verwandte Themen