2010-12-09 12 views
4

Programm A, ist ein c-Programm, das endlos Eingaben in stdin empfängt, verarbeitet und an stdout ausgibt.Wie kann ich erreichen, dass diese beiden Prozesse (Programme) über Pipes direkt miteinander kommunizieren?

Ich möchte Programm B (in Python) schreiben, so dass es die Ausgabe von A liest, und es mit allem, was benötigt wird, füttern. Hinweis muss es nur eine Instanz jedes dieser Programme sein, so gegeben b1 und b2, die Instanzen von b statt:

$ b1 | a | b2 

I

$ b1 | a | b1 

Hier finden Sie das Diagramm haben müssen des endgültigen gewünschten Ergebnis:

alt text

+1

Was ist der Stop-Bedingung? Wie Sie definiert haben, werden Ihre Programme, solange Ihre Programme nicht auf Festplatte schreiben oder auf 'stderr' ausgeben, endlos weiterlaufen, bis ein Sentinel wie' EOF' oder 'SIGINT' gegeben wird. – MrGomez

+1

@MrGomez, keine Sorge darüber. quit kann über stdin übergeben werden. außerdem sollen sie endlos laufen ;-) –

Antwort

6

Verwenden der subprocess.Popen Klasse einen Unterprozess für das Programm A. F zu erzeugen oder Beispiel:

import subprocess 
import sys 

# Create subprocess with pipes for stdin and stdout 
progA = subprocess.Popen("a", stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

# Reassign the pipes to our stdin and stdout 
sys.stdin = progA.stdout 
sys.stdout = progA.stdin 

Jetzt können die zwei Prozesse über die Rohre hin und her miteinander kommunizieren. Es könnte auch eine gute Idee sein, die ursprünglichen sys.stdin und sys.stdout in anderen Variablen zu speichern, so dass Sie stdin und stdout in ihren ursprünglichen Zuständen wiederherstellen können (z. B. das Terminal), wenn Sie sich jemals dazu entscheiden, den Subprozess zu beenden.

+3

Ich würde die Zuweisungen sys.std * überspringen, benutze einfach die Objekte progA.stdout und ProgA.stdin direkt. Auf diese Weise verlieren Sie nicht die Standardausgabe. –

+1

die Neuzuweisung ist der Teil, den ich verpasst habe. Danke vielmals! (warten Sie jetzt 8 Minuten, um Ihre Antwort als akzeptierte Antwort zu markieren) –

+2

@Winston Ewert: Ich stimme zu, das ist wahrscheinlich die bessere Option, aber da OP sich die Zeit genommen hat, ein so schönes Diagramm zu machen, hat er wahrscheinlich eine gute Grund dafür, stdin und stdout neu zuordnen zu wollen. –

1

Für diejenigen, die hier von Google kommen: Es ist eigentlich ein sehr guter Weg, Named Pipes mit:

mkfifo pipe1 
mkfifo pipe2 

dann diese laufen:

echo -n x | cat - pipe1 > pipe2 & cat <pipe2 > pipe1 

ersten 2 Namen Rohre erstellen

Dies bewirkt, dass die cat-Befehle den Buchstaben x ständig kopieren. So können Sie jetzt Ihre eigenen Programme anstelle von cat verwenden, um die Eingabe und Ausgabe zu verarbeiten. Dies ist nicht auf Python beschränkt. Sie können auch ein Java-Programm mit einem C++ - Programm verbinden.

Zum Beispiel, wenn Ihre Programme aufgerufen werden A.py und B.py der erste Befehl wäre:

echo -n x | ./A.py - pipe1 > pipe2 & ./B.py <pipe2 > pipe1