Exec パッケージを使用した Go でのコマンドのパイプ
Go でのコマンドのパイプは、os/exec パッケージを使用して実現できます。ただし、あるコマンドの出力を別のコマンドにパイプしようとすると、問題が発生する可能性があります。この記事では、このような課題に対処し、解決策を提供します。
キャプチャされた画像からビデオを作成するために、phantomjs から ffmpeg に stdout をパイプする次のコマンドを考えてみましょう。
phantomjs runner.js | ffmpeg -y -c:v png -f image2pipe -r 25 -t 10 -i - -c:v libx264 -pix_fmt yuv420p -movflags +faststart dragon.mp4
問題:
exec.Command(parts[0], Parts[1:]...) を使用してこのコマンドを実行すると、parts はコマンド コンポーネントを表し、パイプは無視されます。
解決策:
出力を効果的にパイプするには、次のアプローチを採用します。
exec.Command("bash", "-c", command) を使用して実行します。コマンドは bash スクリプトとして記述されます。ここで、command は目的のパイプされたコマンドです。このメソッドはパイプを透過的に処理します。
例:
import ( "fmt" "os/exec" ) func main() { cmd := "phantomjs runner.js | ffmpeg -y -c:v png -f image2pipe -r 25 -t 10 -i - -c:v libx264 -pix_fmt yuv420p -movflags +faststart dragon.mp4" output, err := exec.Command("bash", "-c", cmd).Output() if err != nil { fmt.Printf("Failed to execute command: %s", cmd) } fmt.Println(string(output)) }
コマンドを bash スクリプトとして実行すると、パイプが尊重されるようになり、phantomjs の出力を ffmpeg にシームレスに供給できるようになります。
以上がGo の `os/exec` パッケージでコマンドを適切にパイプする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。