我正在构建一个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应用程序中运行命令行程序的最佳做法是什么?
消息队列是实现整个请求响应周期的一件事。但还有其他方法可以让这些东西更优雅吗?
答案 0 :(得分:225)
subprocess
模块是从Python运行其他程序的首选方式 - 比os.system
更灵活,更灵活。
import subprocess
#subprocess.check_output(['ls','-l']) #all that is technically needed...
print subprocess.check_output(['ls','-l'])
答案 1 :(得分:23)
“整个设置对我来说似乎有些不稳定。”
与ffmpegx人讨论在命令行后端拥有GUI前端的问题。它似乎没有打扰他们。
实际上,我认为命令行后端的GUI(或Web)前端实际上更稳定,因为GUI和命令之间的界面非常非常干净。该命令可以以与Web不同的速度发展,只要命令行选项兼容,就不会有破坏的可能性。
答案 2 :(得分:2)
我不熟悉sox,但是不是将命令行重复调用程序,是否可以将其设置为服务并连接到请求?您可以查看连接界面,例如sqlite,以获取灵感。
答案 3 :(得分:2)
如果您担心服务器性能,那么请考虑限制正在运行的sox进程的数量。如果上限被命中,您可以随时缓存请求,并以适合您的应用程序的方式通知用户。
或者,在其他计算机上使用n个工作脚本从数据库中提取请求并调用sox,然后将生成的输出文件推送到需要的位置。