Python: wenn pty.fork () im Vergleich zu os.fork () zu verwenden,
Frage
Ich bin nicht sicher, ob Gebrauch pty.fork()
oder os.fork()
, wenn sie von meiner app externen Hintergrundprozesse Laichen. (Wie Schach-Engines)
Ich mag die gelaicht Prozesse sterben, wenn die Eltern getötet wird, wie bei Anwendungen in einem Terminal Laichen.
Was sind die Höhen und Tiefen zwischen den beiden Gabeln?
Lösung
Das Kind Prozess mit os.fork()
erstellt inherits stdin / stdout / stderr aus übergeordnetem Prozess, während das Kind mit pty.fork()
geschaffen, um neuen Pseudo-Terminal verbunden ist. Sie müssen die später, wenn Sie ein Programm wie xterm schreiben: pty.fork()
in Eltern-Prozess gibt einen Descriptor-Anschluss des Kindes Prozess zu steuern, so dass Sie visuell Daten daraus darstellen können und Benutzeraktionen in Terminal Eingangssequenzen übersetzen
Update:
Von pty (7) man-Seite:
Ein Prozess, der erwartet angeschlossen werden zu einem Terminal kann, öffnen Sie das Slave-Ende ein Pseudo-Terminal und dann durch ein Programm gesteuert, das hat das Master-Ende geöffnet. Alles was wird auf dem Master-Ende geschrieben ist den Prozess auf dem Slave vorgesehen Ende, als ob es wurde Eingabe getippt auf ein Terminal. Zum Beispiel schreibt die Interrupt-Zeichen (in der Regel Steuer-C) an die Master-Einrichtung verursachen würde ein Interruptsignal (SIGINT) werden für die erzeugten Vordergrundprozess Gruppe, die ist den Slave verbunden ist. Umgekehrt, alles, was auf dem geschrieben wird Slave-Ende des pseudo-Terminal kann durch den Prozess gelesen werden, ist verbunden mit dem Master-Ende.
Andere Tipps
In der Vergangenheit habe ich immer das subprocess
Modul zum Einsatz. Es bietet eine gute api mit Subprozesse für die Kommunikation.
Sie können call(*popenargs, **kwargs)
verwenden für die Ausführung von ihnen blockieren, und ich glaube, die Popen
-Klasse kann async Ausführung behandeln.
Schauen Sie sich die docs für weitere Informationen.
Was mit os.fork
vs pty.fork
sind beide sehr plattformabhängig, und weder arbeiten (oder zumindest getestet wird) mit Fenstern. Das pty
Modul scheint die mehr eingeschränkt der beiden durch das Lesen der Dokumente zu werden. Der Hauptunterschied ist, der Pseudo-Terminal Aspekt. Also, wenn Sie an den Architekten nicht bereit sind, Ihren Code in einer solchen Art und Weise, wie in der Lage sein, den subprocess
Modul zu verwenden, ich wahrscheinlich mit os.fork
statt pty.fork
gehen würde.
Pseudotermials sind für einige Anwendungen notwendig, die wirklich ein Terminal erwarten. Eine interaktive Shell ist eines dieser Beispiele, aber es gibt viele andere. Die pty.fork Option ist nicht da als ein andere os.fork sondern als eine bestimmte API einen Pseudoterminal zu nutzen.