3 votes

streamer stdout d'un autre programme sans for loop

J'ai un programme qui compile et exécute un autre programme et se renvoie le stdout à lui-même pour l'impression, puisque ce programme ne se termine pas et que j'ai besoin de streamer son stdout.

// boilerplate ommited

func stream(stdoutPipe io.ReadCloser) {
    buffer := make([]byte, 100, 1000)
    for ;; {
        n, err := stdoutPipe.Read(buffer)
        if err == io.EOF {
            stdoutPipe.Close()
            break
        }
        buffer = buffer[0:n]
        os.Stdout.Write(buffer)
    }
}

func main() {
    command := exec.Command("go", "run", "my-program.go")
    stdoutPipe, _ := command.StdoutPipe()

    _ = command.Start()

    go stream(stdoutPipe)

    do_my_own_thing()

    command.Wait()
}

Cela fonctionne, mais comment puis-je faire la même chose sans vérifier de manière répétée avec une boucle for, existe-t-il une fonction de bibliothèque qui fait la même chose ?

12voto

Stephen Weinberg Points 12682

Vous pouvez donner à l exec.Cmd un io.Writer à utiliser comme stdout. La variable que votre propre programme utilise pour stdout ( os.Stdout ) est également un io.Writer .

command := exec.Command("go", "run", "my-program.go")
command.Stdout = os.Stdout
command.Start()
command.Wait()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X