Cara Mendapatkan Keluaran Masa Nyata dan Mencetak Maklumat Diproses daripada Perintah Shell di Golang
Dalam panduan ini, kami akan menumpukan pada satu senario di mana kami melaksanakan perintah shell yang menghasilkan output dalam masa nyata, seperti ffmpeg. Kami berhasrat untuk mendapatkan semula output ini secara berterusan dan mencetak maklumat yang diproses berdasarkan data yang diberikannya.
Mari kita pecahkan kod asal dan jelaskan isu ini:
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) { // ... }
Isunya terletak pada andaian output akan dihantar ke stdout, tetapi sebenarnya, ffmpeg menghantar mesej diagnostik kepada stderr sebaliknya. Untuk menangkap output yang dikehendaki, kita perlu menyalurkan aliran stderr. Berikut ialah kod yang disemak yang menangani perkara ini:
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() }
Kini, kod dibaca daripada paip stderr dan mencetak perkataan yang diterimanya. Ini memastikan bahawa kami menangkap dan memaparkan mesej diagnostik yang dijana oleh ffmpeg.
Sebagai contoh, jika bar kemajuan ffmpeg kelihatan seperti ini:
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/
Kod kami akan menangkap dan mencetak perkataan ini sebaris baris:
frame= 101 fps= 0.0 q= 28.0 size= 91kB time= 00:00:04.13 bitrate= 181.2kbits/ ... (and so on)
Anda kemudian boleh menggunakan perkataan ini untuk menghuraikan maklumat yang berkaitan dan mengemas kini kemajuan anda sewajarnya.
Atas ialah kandungan terperinci Bagaimana untuk Menangkap dan Mencetak Output Masa Nyata daripada Ralat Standard Perintah Shell di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!