从python执行命令行程序
可能重复:
在Python中调用外部命令
我正在构build一个将要操作(打击,混音,合并等)声音文件的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'])
“这整个设置对我来说似乎有点不稳定。”
与ffmpegx的人讨论在命令行后端有一个GUI前端。 似乎没有打扰他们。
事实上,我认为在命令行后端的GUI(或web)前端实际上更稳定,因为在GUI和命令之间有非常非常干净的界面。 只要命令行选项兼容,命令就可以以不同于networking的速度演变,不会有任何破坏的可能性。
我感到有点不舒服,有一个python web应用程序启动新的sox进程在我的服务器上的每个请求的基础上。
对我来说,这似乎意味着他担心,如果他向公众开放了他的networking服务器,那么如果有15000人决定点击那个会启动sox的button,他可以做的不多,以防止他的服务器资源被占用通过这种方式。
我对sox并不熟悉,但是可以将它作为一个服务设置并连接到请求,而不是将它作为命令行重复调用。 你可以看看连接界面,如sqlite的灵感。
如果您担心服务器性能,那么请考虑限制正在运行的sox进程的数量。 如果上限已被击中,您可以随时caching该请求,并以任何适合您的应用程序的方式通知用户何时完成。
或者,在其他机器上有n个worker脚本,它们从db中调用请求并调用sox,然后将生成的输出文件推送到需要的地方。