Piping-Befehle in Go mit dem Exec-Paket
Piping-Befehle in Go können mit dem os/exec-Paket erreicht werden. Beim Versuch, die Ausgabe eines Befehls an einen anderen weiterzuleiten, können jedoch Schwierigkeiten auftreten. Dieser Artikel befasst sich mit solchen Herausforderungen und bietet eine Lösung.
Betrachten Sie den folgenden Befehl, der die Standardausgabe von phantomjs an ffmpeg weiterleitet, um aus aufgenommenen Bildern ein Video zu erstellen:
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
Problem:
Ausführen dieses Befehls mit exec.Command(parts[0], parts[1:]...), wobei parts die Befehlskomponenten darstellt, berücksichtigt die Pipe nicht.
Lösung:
Um die Ausgabe effektiv weiterzuleiten, verwenden Sie „epple“. Der folgende Ansatz:
Verwenden Sie exec.Command("bash", "-c", command), um den Befehl als Bash-Skript auszuführen, wobei command der gewünschte Pipeline-Befehl ist. Diese Methode behandelt Pipes transparent.
Beispiel:
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)) }
Durch die Ausführung des Befehls als Bash-Skript wird die Pipe nun berücksichtigt, sodass die Ausgabe von PhantomJS nahtlos in ffmpeg eingespeist werden kann.
Das obige ist der detaillierte Inhalt vonWie leitet man Befehle im Go-Paket „os/exec' richtig weiter?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!