从python中执行命令行程序

时间:2009-01-16 12:30:44

标签: python command-line

  

可能重复:
  Calling an external command in 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应用程序中运行命令行程序的最佳做法是什么?

消息队列是实现整个请求响应周期的一件事。但还有其他方法可以让这些东西更优雅吗?

4 个答案:

答案 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,然后将生成的输出文件推送到需要的位置。