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.
Mit 'subprocess.Popen' wird ein anderer Prozess ausgeführt, und Sie erhalten sofort die Kontrolle über den übergeordneten Prozess. Wahrscheinlich was du willst. –
Mögliches Duplikat von [Unterprozess im Hintergrund ausführen] (https://stackoverflow.com/questions/32577071/execute-subprocess-in-background) – tima