59

"concat:file1|file2"コマンドラインでffmpegの引数を囲むリテラルの二重引用符でのみ機能するコマンドを渡そうとしています。

ただし、これを python で動作させることはできませんsubprocess.Popen()。引用符を subprocess.Popen に渡す方法を知っている人はいますか?

コードは次のとおりです。

command = "ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy temp.mp4"

output,error = subprocess.Popen(command, universal_newlines=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE).communicate()

これを行うと、ffmpeg は concat セグメントを引用符で囲む以外の方法では使用しません。この行を subprocess.Popen コマンドに正常に渡す方法はありますか?

4

7 に答える 7

63

引用符で囲まれた文字列バージョンではなく、リスト形式の呼び出しを使用することをお勧めします。

command = ["ffmpeg", "-i", "concat:1.ts|2.ts", "-vcodec", "copy",
           "-acodec", "copy", "temp.mp4"]
output,error  = subprocess.Popen(
                    command, universal_newlines=True,
                    stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

これにより、最終プロセスに渡されるパラメーターの正確なセットがより正確に表され、シェルの引用符をいじる必要がなくなります。

つまり、プレーン文字列バージョンを絶対に使用したい場合は、別の引用符 (およびshell=True) を使用してください。

command = 'ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy temp.mp4'
output,error  = subprocess.Popen(
                    command, universal_newlines=True, shell=True,
                    stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
于 2013-02-18T03:10:59.270 に答える
9

単一引用符を使用して二重引用符'around the "whole pattern"'を自動的にエスケープするか、明示的にエスケープします"escape the \"double quotes\""。あなたの問題はそれ自体とは何の関係もありませんPopen

記録のために、私はWindowsで glob パターン (つまり、受け入れられた回答で提案されたもの) を囲む適切な二重引用符を保持しないlistに渡されたベースのコマンドに特に問題がありました。リストを渡す前に文字列に結合して問題を解決しました。Popen' '.join(cmd)Popen

于 2016-08-23T08:45:01.903 に答える
8

これは python 2.7.3 で動作します。 stderr を stdout にパイプするコマンドは、古いバージョンの python から変更されました。

これを test.py というファイルに入れます。

#!/usr/bin/python
import subprocess

command = 'php -r "echo gethostname();"'
p = subprocess.Popen(command, universal_newlines=True, shell=True, 
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
text = p.stdout.read()
retcode = p.wait()
print text

それを呼び出します:

python test.py

それは apollo である私のホスト名を出力します:

apollo

サブプロセスのマニュアルを読んでください: http://docs.python.org/2/library/subprocess.html

于 2013-12-10T05:20:29.240 に答える