Bagaimana untuk Menstrim Output Langsung daripada Perintah yang Dilaksanakan dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-11-24 05:48:09
asal
724 orang telah melayarinya

How to Stream Live Output from Executed Commands in Go?

Output Langsung Perintah yang Dilaksanakan

Coretan kod ini mempamerkan masalah yang sering dihadapi semasa menjalankan arahan dan mendapatkan semula keluarannya dalam Go: output menjadi tersedia hanya selepas arahan selesai dilaksanakan. Untuk menangani ini, penyelesaian yang diubah suai disediakan yang membolehkan penstriman langsung output arahan.

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}

for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Printf("%s cmd.StdoutPipe() error: %v\n", cp[1:], err)
        return
    }
    // Start command:
    if err = cmd.Start(); err != nil {
        log.Printf("%s start error: %v\n", cp[1:], err)
        return
    }

    // Stream command output:
    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanRunes)
    for scanner.Scan() {
        fmt.Print(scanner.Text())
    }
    if scanner.Err() != nil {
        log.Printf("Reading %s stdout error: %v\n", cp[1:], err)
        return
    }

    // Get execution success or failure:
    if err = cmd.Wait(); err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Printf("Finished %s", cp[1:])
}
Salin selepas log masuk

Penjelasan:

  • cmd.StdoutPipe() mencipta paip yang membolehkan kita membaca output standard arahan itu masa nyata.
  • bufio.NewScanner(stdout) mencipta pengimbas yang membaca daripada paip output mengikut rune (aksara).
  • scanner.Scan() membaca dan mencetak setiap aksara apabila ia menjadi tersedia.
  • Gelung meneruskan membaca dan mencetak aksara sehingga arahan selesai atau ralat berlaku.
  • Selepas arahan selesai, baki output dicetak dan status keluar arahan itu diperoleh semula.

Nota Tambahan:

  • Penyelesaian ini hanya menstrim output standard. Ralat standard juga boleh distrim menggunakan Command.StderrPipe().
  • Sesetengah arahan mungkin tidak menulis segala-galanya ke output atau ralat standardnya. Dalam kes sedemikian, output mungkin tidak distrim dengan betul.

Atas ialah kandungan terperinci Bagaimana untuk Menstrim Output Langsung daripada Perintah yang Dilaksanakan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan