Ich versuche, Python in einem Terminalfenster auszuführen und es von einer Named Pipe umzuleiten. Dann schreibe ich in die Named Pipe in einem anderen Terminal und lasse diesen Befehl auf Python ausführen.
Terminal 1:
mkfifo p1
python < p1
Terminal 2:
echo -n "print \"Hello World\"" > p1
Was passiert ist - Python druckt Hello World
und beendet. Was ich tun möchte, ist, Python am Laufen zu halten, um einen nächsten Befehl auszuführen. Wie mache ich das in der Shell?
exec 3> p1
macht und was ist&3
&exec 3> &1
? Vielen Dank.exec 3>&-
das genauso funktionieren wieexec 3>&1
hier?3>&-
hier schreiben .3>&1
würde auch funktionieren, macht aber wenig Sinn. Vielen DankSie können verwenden
tail -f
, um das FIFO nach dem Schreiben offen zu haltenecho
.Warum das so ist
python
liest ausp1
. Wenn das Ende der Datei erreicht ist, hört es auf zu lesen. Dies ist ein normales Verhalten beim Lesen von Dateien, auch wenn es sich bei der Datei um eine Named Pipe handelt.tail
Mit dem-f
Flag (Folgen) wird nach Erreichen des Endes weiter aus einer Datei gelesen.quelle
echo "print \"Hello World\" " > p1
im zweiten Terminal versucht und nichts ist passiert - aber das Terminal wurde auch nicht blockiert. Das Terminal mit Python blieb blockiert, bis ich^c
es und beende es und beende Python mit einer Tastatur-Interrupt-Meldung, die von Python angezeigt wird.tail -f
Trick verwendet, als ich das Block-Split-Teer-Archiv über eine Named Pipe entpackt habe. Es hat wunderbar funktioniert.Sie müssen das gesamte Programm auf einmal senden.
Wenn Sie run aufrufen,
python < p1
wartet die Shell auf die Eingabe, bevor Sie Python aufrufen. Das heißt, dass Python nicht einmal ansatzweise die Ausführung überhaupt , bis der gesamte Datenstrom von dem Shell gelesen und dann in vollem Umfang weitergegeben wirdpython
.Selbst
python -u p1
wenn Sie stattdessen ausführen (dh ungepuffert und aus einer Datei lesenp1
),python
wird versucht, die gesamte Datei zu lesen, bevor sie ausgeführt wird.Versuchen Sie dieses Experiment.
Terminal 1:
Terminal 2:
Sie werden sehen, dass Sie mehrere Zeilen senden können, aber Python in Term 1 tut nichts. Drücken Sie nun ctrl+ D. Das gesamte Programm wird sofort ausgeführt.
Um zusammenzufassen, wenn Sie möchten, dass Python aus einer Pipe liest, müssen Sie das gesamte Programm senden. Sie können Python auf diese Weise nicht interaktiv verwenden.
quelle
Vielleicht ist der Heckansatz besser (flexibler), aber als Alternative:
quelle
-n
könnte entfernt werden müssen. Und danach 0. Das Terminal mit demecho
Befehl wird blockiert 1. Python führt den Befehl erst aus, wenn ich^c
dasecho
Terminal drücke und beide Prozesse beendet werden.