Maison > développement back-end > Golang > Comment capturer et imprimer la sortie en temps réel à partir de l'erreur standard d'une commande Shell dans Golang ?

Comment capturer et imprimer la sortie en temps réel à partir de l'erreur standard d'une commande Shell dans Golang ?

Susan Sarandon
Libérer: 2024-12-10 03:03:09
original
374 Les gens l'ont consulté

How to Capture and Print Realtime Output from a Shell Command's Standard Error in Golang?

Comment récupérer la sortie en temps réel et imprimer les informations traitées à partir d'une commande Shell dans Golang

Dans ce guide, nous nous concentrerons sur un sujet spécifique scénario dans lequel nous exécutons une commande shell qui produit une sortie en temps réel, telle que ffmpeg. Notre objectif est de récupérer ce résultat de manière constante et d'imprimer les informations traitées en fonction des données qu'il fournit.

Décomposons le code original et expliquons le problème :

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) {
    // ...
}
Copier après la connexion

Le problème réside dans l'hypothèse que le la sortie sera envoyée à stdout, mais en réalité, ffmpeg envoie des messages de diagnostic à stderr à la place. Pour capturer la sortie souhaitée, nous devons diriger le flux stderr. Voici un code révisé qui résout ce problème :

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()
}
Copier après la connexion

Maintenant, le code lit le tube stderr et imprime les mots qu'il reçoit. Cela garantit que nous capturons et affichons les messages de diagnostic générés par ffmpeg.

Par exemple, si la barre de progression de ffmpeg ressemble à ceci :

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/
Copier après la connexion

Notre code capturera et imprimera ces mots ligne par ligne :

frame=
101
fps=
0.0
q=
28.0
size=
91kB
time=
00:00:04.13
bitrate=
181.2kbits/
... (and so on)
Copier après la connexion

Vous pouvez ensuite utiliser ces mots pour analyser les informations pertinentes et mettre à jour vos progrès en conséquence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal