So rufen Sie die Echtzeitausgabe ab und drucken verarbeitete Informationen von einem Shell-Befehl in Golang
In diesem Leitfaden konzentrieren wir uns auf ein bestimmtes Thema Szenario, in dem wir einen Shell-Befehl ausführen, der eine Ausgabe in Echtzeit erzeugt, z. B. ffmpeg. Unser Ziel ist es, diese Ausgabe stetig abzurufen und verarbeitete Informationen basierend auf den bereitgestellten Daten auszudrucken.
Lassen Sie uns den Originalcode aufschlüsseln und das Problem erklären:
package main import ( "bufio" "fmt" "io" "os" "os/exec" "strings" ) func main() { // ... stdout, _ := cmd.StdoutPipe() cmd.Start() go print(stdout) cmd.Wait() } func print(stdout io.ReadCloser) { // ... }
Das Problem liegt in der Annahme, dass Die Ausgabe wird an stdout gesendet, aber in Wirklichkeit sendet ffmpeg Diagnosemeldungen stattdessen an stderr. Um die gewünschte Ausgabe zu erfassen, müssen wir den stderr-Stream weiterleiten. Hier ist ein überarbeiteter Code, der dieses Problem behebt:
func main() { // ... stderr, _ := cmd.StderrPipe() cmd.Start() scanner := bufio.NewScanner(stderr) scanner.Split(bufio.ScanWords) for scanner.Scan() { m := scanner.Text() fmt.Println(m) } cmd.Wait() }
Jetzt liest der Code aus der stderr-Pipe und gibt die empfangenen Wörter aus. Dadurch wird sichergestellt, dass wir die von ffmpeg generierten Diagnosemeldungen erfassen und anzeigen.
Wenn der Fortschrittsbalken von ffmpeg beispielsweise so aussieht:
frame= 101 fps=0.0 q=28.0 size= 91kB time=00:00:04.13 bitrate= 181.2kbits/ frame= 169 fps=168 q=28.0 size= 227kB time=00:00:06.82 bitrate= 272.6kbits/ frame= 231 fps=153 q=28.0 size= 348kB time=00:00:09.31 bitrate= 306.3kbits/ frame= 282 fps=140 q=28.0 size= 499kB time=00:00:11.33 bitrate= 360.8kbits/
Unser Code erfasst und druckt diese Wörter Zeile für Zeile Zeile:
frame= 101 fps= 0.0 q= 28.0 size= 91kB time= 00:00:04.13 bitrate= 181.2kbits/ ... (and so on)
Sie können diese Wörter dann verwenden, um die relevanten Informationen zu analysieren und Ihren Fortschritt entsprechend zu aktualisieren.
Das obige ist der detaillierte Inhalt vonWie kann ich die Echtzeitausgabe des Standardfehlers eines Shell-Befehls in Golang erfassen und drucken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!