Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menstrim Output Perintah dalam Masa Nyata Daripada Menunggu Penyelesaian Pelaksanaan?

Bagaimana untuk Menstrim Output Perintah dalam Masa Nyata Daripada Menunggu Penyelesaian Pelaksanaan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-17 21:00:03421semak imbas

How to Stream Command Output in Real-time Instead of Waiting for Execution Completion?

Menjalankan Perintah dan Menstrim Outputnya

Masalah: Paparan Output Tertunda

Pada masa ini, kod anda memproses arahan dan hanya memaparkan outputnya sebaik sahaja pelaksanaan selesai. Anda mencari penyelesaian untuk menstrim output secara langsung dan bukannya menunggu proses selesai.

Penyelesaian: Penstriman Output Perintah

Gunakan pendekatan berikut untuk menstrim 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:])
}

Penjelasan

  • cmd.StdoutPipe() mencipta paip yang akan membekalkan sebarang output yang ditulis oleh arahan.
  • pengimbas := bufio.NewScanner(stdout) memulakan pengimbas yang akan membaca output daripada paip.
  • scanner.Split(bufio.ScanRunes) memastikan pengimbas membaca dan memproses setiap aksara (rune) output.
  • Gelung for membaca aksara secara berterusan daripada paip stdout dan mencetaknya ke skrin.
  • Selepas pelaksanaan arahan selesai, cmd.Wait() menyemak kejayaan atau kegagalannya dan merekodkan hasilnya.

Atas ialah kandungan terperinci Bagaimana untuk Menstrim Output Perintah dalam Masa Nyata Daripada Menunggu Penyelesaian Pelaksanaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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