Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menangkap stdout Pelaksanaan Perintah dalam Masa Nyata?

Bagaimana untuk Menangkap stdout Pelaksanaan Perintah dalam Masa Nyata?

Linda Hamilton
Linda Hamiltonasal
2024-11-02 07:44:29485semak imbas

How to Capture Command Execution stdout in Real Time?

Menangkap stdout Pelaksanaan Perintah dalam Masa Nyata

Dalam chatbot yang melaksanakan arahan, kita sering menghadapi keperluan untuk memaparkan stdout skrip dalam antara muka sembang. Walaupun pelaksanaan semasa mengumpul dan mengembalikan keseluruhan stdout sekaligus, kami mencari penyelesaian yang menyediakan output dalam masa nyata.

Memeriksa kod yang diberikan mendedahkan had di mana stdout diambil dan dikembalikan dalam satu panggilan fungsi (but semula()). Untuk mengeluarkan teks dalam masa nyata, kita perlu mengulangi arahan pelaksanaan dan menangkap stdout secara berterusan.

Kunci kepada penyelesaian ini ialah menggunakan kaedah StdoutPipe, yang membolehkan kami mencipta paip untuk menangkap output perintah yang dilaksanakan. Dengan mewujudkan paip untuk stdout arahan, kami boleh membaca dan memaparkan output secara berterusan.

Kod Diperbaiki:

<code class="go">package main

import (
    "os"
    "os/exec"
    "fmt"
    "bufio"
)

func main() {
    // Specify the command to execute
    cmd := exec.Command("command", "arguments")

    // Create a pipe for the output of the script
    cmdReader, err := cmd.StdoutPipe()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err)
        return
    }

    scanner := bufio.NewScanner(cmdReader)

    // Launch a goroutine to continuously read and display the output
    go func() {
        for scanner.Scan() {
            fmt.Printf("\t > %s\n", scanner.Text())
        }
    }()

    // Start the execution of the command
    err = cmd.Start()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error starting Cmd", err)
        return
    }

    // Wait for the command to complete
    err = cmd.Wait()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err)
        return
    }
}</code>

Dalam penyelesaian yang dipertingkat ini, kami terus membaca output daripada stdout arahan dalam goroutine, membenarkan paparan masa nyata stdout dalam antara muka sembang. Ini menghapuskan keperluan untuk penimbal yang besar dan mengelakkan pengembalian keseluruhan stdout dalam satu panggilan fungsi, menangani isu asal.

Atas ialah kandungan terperinci Bagaimana untuk Menangkap stdout Pelaksanaan Perintah dalam Masa Nyata?. 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