2017-09-07 1 views
0

Wird das Unterprozessmodul in Python im Hintergrund ausgeführt, während Sie weiterhin mit dem Programm fortfahren können?Subprozessmodul im Hintergrund?

Zum Beispiel: Wenn ich "tail -f * .log" als Subprozess verwenden würde und ich diese Zeilen in Python lese, bin ich immer noch in der Lage, andere Aufgaben gleichzeitig mit dem "Tail" -Prozess auszuführen? Oder ist das eher ein Multithread?

+0

Mit 'subprocess.Popen' wird ein anderer Prozess ausgeführt, und Sie erhalten sofort die Kontrolle über den übergeordneten Prozess. Wahrscheinlich was du willst. –

+0

Mögliches Duplikat von [Unterprozess im Hintergrund ausführen] (https://stackoverflow.com/questions/32577071/execute-subprocess-in-background) – tima

Antwort

0

subprocess.check_output warten, bis der untergeordnete Prozess beendet wird und erst dann gibt es seine Ausgabe.

subprocess.Popen macht was Sie wollen. Es sieht ungefähr so ​​aus:

Sie benötigen die Shell = True, damit der Platzhalter in * .log interpretiert wird. Wenn nicht, würden Sie die Shell nicht benötigen. Seien Sie vorsichtig bei der Übergabe von Argumenten an Popen mit shell = True; Dies kann ein Sicherheitsrisiko darstellen, wenn die Argumente vom Benutzer bereitgestellt werden. Es ist normalerweise besser, einen Weg zu finden, der die Shell nicht benötigt. In Ihrem Fall wäre das einfach genug - Sie müssten lediglich die Liste der Protokolldateien mit Python erstellen und dann die Listenelemente als weitere Argumente übergeben.

Die stdout = subprocess.PIPE ist hier, so dass Sie eine Möglichkeit haben, die Ausgabe des Tails zu lesen. Sie können darauf zugreifen über proc.stdout und lesen Sie es aus wie von einer normalen Datei.

Das Lesen wird sich jedoch als etwas schwierig erweisen, da Sie es regelmäßig tun müssen, um sicherzustellen, dass der Puffer der Pipe nicht voll wird und den Tail-Prozess blockiert. Eine Möglichkeit besteht darin, einen Thread zu starten, der nichts anderes tut, als die Ausgabe des Tails in einen Puffer zu lesen, der groß genug ist.