コマンド実行の stdout をリアルタイムでキャプチャする
コマンドを実行するチャットボットでは、スクリプト内のスクリプトの stdout を表示する必要がよくあります。チャットインターフェイス。現在の実装では標準出力全体を一度に収集して返しますが、リアルタイムで出力を提供するソリューションを模索しています。
指定されたコードを検査すると、単一の関数呼び出しで標準出力が取得されて返されるという制限があることがわかります。 (リブート())。リアルタイムでテキストを出力するには、実行コマンドを反復処理し、stdout を継続的にキャプチャする必要があります。
このソリューションの鍵は、StdoutPipe メソッドを利用することです。これにより、出力をキャプチャするためのパイプを作成できます。実行されたコマンド。コマンドの標準出力のパイプを確立することで、出力を継続的に読み取って表示できます。
改善されたコード:
<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>
この改善されたソリューションでは、継続的に読み取ります。 goroutine 内のコマンドの stdout からの出力。これにより、チャット インターフェイスでの stdout のリアルタイム表示が可能になります。これにより、大きなバッファが必要なくなり、単一の関数呼び出しで標準出力全体が返されることがなくなり、元の問題が解決されます。
以上がコマンド実行の標準出力をリアルタイムでキャプチャする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。