可能な重複:
Pythonで外部コマンドを呼び出す
私は、サウンドファイルを操作(パッド、ミックス、マージなど)するWebアプリケーションを作成していますが、 sox は正確に機能する欲しいものSoxはLinuxのコマンドラインプログラムなので、リクエストごとに自分のサーバー上でpython Webアプリケーションが新しいsoxプロセスを開始するのには少々不快を感じます。
例:
import os
os.system('sox input.wav -b 24 output.aiff rate -v -L -b 90 48k')
この設定全体は私には少し不安定に思えます。
それで、私の質問は、Python(または他のスクリプト言語)Webアプリ内からコマンドラインプログラムを実行するためのベストプラクティスは何ですか?
メッセージキューは、要求応答サイクル全体を回避するために実装する必要があります。しかし、これらをもっとエレガントにする方法は他にありますか?
subprocess
モジュールはPythonから他のプログラムを実行するのに好ましい方法です - os.system
よりもはるかに柔軟で使いやすいです。
import subprocess
#subprocess.check_output(['ls','-l']) #all that is technically needed...
print subprocess.check_output(['ls','-l'])
「この設定全体は私には少し不安定に思えます。」
コマンドラインバックエンドの上にGUIフロントエンドを持つことについて ffmpegx の人々に相談してください。気にしないようです。
確かに、GUIとコマンドの間にはとてもきれいなインターフェースがあるので、コマンドラインバックエンドよりもGUI(またはWeb)フロントエンドのほうが実際にはより安定していると私は思います。コマンドラインオプションに互換性がある限り、コマンドはWebとは異なるペースで進化する可能性があります。破損する可能性はありません。
サーバーのパフォーマンスが気になる場合は、実行中のsoxプロセス数の上限を見てください。上限に達した場合は、いつでもリクエストをキャッシュして、完了したときにアプリケーションに適した方法でユーザーに通知できます。
あるいは、dbから要求を引き出してsoxを呼び出す他のマシン上のn個のワーカースクリプトを使用して、結果の出力ファイルを必要な場所にプッシュします。
私はsoxに慣れていませんが、コマンドラインとしてプログラムを繰り返し呼び出すのではなく、サービスとして設定してリクエストに接続することは可能ですか?インスピレーションを得るには、 sqlite のような接続インターフェースを見てください。