web-dev-qa-db-ja.com

python内からコマンドラインプログラムを実行する

可能な重複:
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アプリ内からコマンドラインプログラムを実行するためのベストプラクティスは何ですか?

メッセージキューは、要求応答サイクル全体を回避するために実装する必要があります。しかし、これらをもっとエレガントにする方法は他にありますか?

233
Mattias

subprocess モジュールはPythonから他のプログラムを実行するのに好ましい方法です - os.systemよりもはるかに柔軟で使いやすいです。

import subprocess
#subprocess.check_output(['ls','-l']) #all that is technically needed...
print subprocess.check_output(['ls','-l'])
227
dF.

「この設定全体は私には少し不安定に思えます。」

コマンドラインバックエンドの上にGUIフロントエンドを持つことについて ffmpegx の人々に相談してください。気にしないようです。

確かに、GUIとコマンドの間にはとてもきれいなインターフェースがあるので、コマンドラインバックエンドよりもGUI(またはWeb)フロントエンドのほうが実際にはより安定していると私は思います。コマンドラインオプションに互換性がある限り、コマンドはWebとは異なるペースで進化する可能性があります。破損する可能性はありません。

23
S.Lott

サーバーのパフォーマンスが気になる場合は、実行中のsoxプロセス数の上限を見てください。上限に達した場合は、いつでもリクエストをキャッシュして、完了したときにアプリケーションに適した方法でユーザーに通知できます。

あるいは、dbから要求を引き出してsoxを呼び出す他のマシン上のn個のワーカースクリプトを使用して、結果の出力ファイルを必要な場所にプッシュします。

2
Dale Reidy

私はsoxに慣れていませんが、コマンドラインとしてプログラムを繰り返し呼び出すのではなく、サービスとして設定してリクエストに接続することは可能ですか?インスピレーションを得るには、 sqlite のような接続インターフェースを見てください。

2
z -