2

subprocess.call を使用して Python 2.7 から ImageMagick コマンドを呼び出そうとしています。私の問題は、サブプロセスの引数パーサーがすべての引数を二重引用符で囲み、ImageMagick がファイル以外の引数を引用符で囲むことに問題があるように見えることです。

私が欲しいのはこのようなものです

"imagemagick.exe" "im1.png" "im2.png" -alpha off ( ... ) -composite "im3.png"

これまでのところ、醜い+ " " +要素で文字列を手動で構築し、 shell=True.

これが私のコードです:

args = [    imagemagick,
            filename + "_b.bmp",
            filename + "_w.bmp",
            "-alpha off ( -clone 0,1 -compose difference -composite -negate ) ( -clone 0,2 +swap -compose divide -composite ) -delete 0,1 +swap -compose Copy_Opacity -composite",
            filename + ".png" ]   

subprocess.call( args )

サブプロセスを使用して二重引用符なしで正しいコマンドを呼び出す方法はありますか?

更新:完全なコマンドラインを挿入しました。その部分は「アルファ」「オフ」・・・ではなく、一つ一つまとめていきたいです。

4

2 に答える 2

3

で外部プログラムを呼び出す場合subprocessすべての引数は の異なる要素でなければなりませんargs。だから試してください:

args = [    imagemagick,
            filename + "_b.bmp",
            filename + "_w.bmp",
            "-alpha", "off", "( ... )", "-composite",
            filename + ".png" ]

が何を( ... )表しているのかわかりませんが、引用符で囲まれていないスペースをコマンドラインに入れると、それらも別の要素になるはずargsです。

于 2012-06-21T01:51:41.387 に答える
1

グレッグの答えのおかげで、私はこの解決策を思いつきました。私のポイントは、Python でコードを読みやすくすることです。これは、複雑な部分をそのままにしておくことが重要であるため、複雑な部分を文字列として保持する必要があることを意味します(必要に応じてコマンドライン/バッチファイルにコピーアンドペーストするなど)。

imarg = "-alpha off ( -clone 0,1 -compose difference -composite -negate ) ( -clone 0,2 +swap -compose divide -composite ) -delete 0,1 +swap -compose Copy_Opacity -composite"
args = [ imagemagick, filename + "_b.bmp", filename + "_w.bmp" ] + imarg.split() + [ filename + ".png" ]
subprocess.call( args )

うまくいきそうです!これで何か問題はありますか?

于 2012-06-21T02:05:43.580 に答える