从python内部执行命令行程序

我正在构建一个web应用程序,将会操纵(垫,混合,合并等)声音文件,我发现确实是我想要的。Sox是一个linux命令行程序,我对python web应用程序在我的服务器上按请求启动新的Sox进程感到有点不舒服。

例子:

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

我觉得这一切都不太稳定。

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

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

525431 次浏览

我不熟悉sox,但是与其作为命令行对程序进行重复调用,不如将其设置为服务并连接到它以获取请求?你可以看看诸如sqlite这样的连接接口来获得灵感。

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和命令之间有一个非常非常干净的接口。命令可以以与web不同的速度发展,只要命令行选项是兼容的,就没有中断的可能性。

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

或者,让其他机器上的n个工作脚本从db中提取请求并调用sox,然后将结果输出文件推到需要的位置。