在python中执行命令行程序

Executing command line programs from within python

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Calling an external command in Python

我正在构建一个Web应用程序,它将处理(pad、mix、merge等)声音文件,我发现sox正是我想要的。SOX是一个Linux命令行程序,我对让PythonWeb应用在我的服务器上按请求启动新的SOX进程感到有点不舒服。

例子:

1
2
import os
os.system('sox input.wav -b 24 output.aiff rate -v -L -b 90 48k')

整个设置对我来说有点不稳定。

所以我的问题是,在Python(或任何脚本语言)Web应用程序中运行命令行程序的最佳实践是什么?

为了绕过整个请求响应周期,需要实现消息队列。但是有没有其他方法让这些东西更优雅呢?


subprocess模块是从python运行其他程序的首选方式——比os.system模块更灵活、更易于使用。

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


"整个设置对我来说有点不稳定。"

与ffmpegx的同事讨论通过命令行后端使用GUI前端的问题。他们似乎不介意。

实际上,我认为通过命令行后端的GUI(或Web)前端实际上更稳定,因为在GUI和命令之间有一个非常非常干净的接口。该命令可以以与Web不同的速度发展,只要命令行选项兼容,就不会出现中断。


如果您关心服务器性能,那么可以考虑限制运行SOX进程的数量。如果达到了上限,您可以缓存请求,并在请求完成时通知用户,无论哪种方式适合您的应用程序。

或者,让其他机器上的n个工作者脚本从数据库中提取请求并调用SOX,然后将生成的输出文件推送到需要的地方。


I'm feeling a little uncomfortable
with having the python web app
starting new sox processes on my
server on a per request basis.

对我来说,这似乎意味着他担心,如果他向公众开放自己的Web服务器,那么如果15000人决定单击这个按钮,以这种方式启动SOX,那么他就没有很多办法阻止服务器资源被消耗。


我对SOX不熟悉,但是我不是以命令行的形式重复调用程序,而是可以将它设置为服务,并在请求时连接到它吗?您可以查看连接接口(如sqlite)以获取灵感。