在Python中执行命令行程序

337

我正在构建一个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应用程序内部运行命令行程序的最佳实践是什么?

消息队列可能是一种实现方式,以避免整个请求响应周期。但是否还有其他方法可以使这些事情更加优雅?


7
相关链接:https://dev59.com/SnVD5IYBdhLWcg3wGXlI,https://dev59.com/KXVC5IYBdhLWcg3wYQEp - S.Lott
我对Python Web应用在每个请求基础上启动新的sox进程感到有些不舒服。对我来说,这似乎意味着他担心如果向公众开放他的Web服务器,那么如果15000人决定单击将以这种方式启动sox的按钮,他将无法阻止服务器资源被消耗的情况。 - Alex Boschmans
@S.Lott 不完全正确,因为它更加特定于Web服务器/ Web应用程序上下文。 - ThomasH
1
@Thomas。我看不出“web”在这种情况下有什么变化。您能解释一下为什么在运行子进程时“web”很重要吗? - S.Lott
2
@S.Lott OP表达了在每个请求基础上启动子进程的担忧。因此,这不仅涉及启动子进程,还涉及限制它们的总数。 - ThomasH
1
@ThomasH: "限制它们的总数量"?看起来更像是网站的请求-响应快,但这个子进程可能会很慢。很难说。我不明白其他参考文献与此无关。 - S.Lott
4个回答

323

subprocess模块是从Python中运行其他程序的首选方式 - 比os.system更灵活且使用起来更加方便。

import subprocess
#subprocess.check_output(['ls', '-l'])  # All that is technically needed...
print(subprocess.check_output(['ls', '-l']))

6
导入子进程模块:import subprocess; 使用subprocess.check_output(['ls', '-l'])可以在命令行中使用ls -l指令。check_output()函数将返回指令的输出结果。 - eleijonmarck
9
通过使用 subprocess.check_call(['ls','-l']),您无需打印输出。 - Yar
2
使用 os 有什么问题? - Charlie Parker
如果我想要使用管道,比如 pip list | grep anatome,该怎么办? - Charlie Parker

28
整个设置对我来说似乎有点不稳定。 与 ffmpegx 的人交谈,让他们在命令行后端上拥有一个GUI前端。这似乎并没有困扰他们。 事实上,我认为基于命令行后端的GUI(或者web界面)前端实际上更加稳定,因为你在GUI和命令之间有一个非常干净的接口。只要命令行选项兼容,命令可以以不同的速度演进,你就不可能出现破坏性问题。

3
如果你担心服务器性能问题,那么可以考虑限制正在运行的sox进程数量。如果达到了上限,您可以始终缓存请求,并以适合您的应用程序的方式通知用户何时完成。
或者,将n个工作脚本放在其他机器上,从数据库中提取请求并调用sox,然后将生成的输出文件推送到所需位置。

2

我不熟悉Sox,但是可以将其设置为服务,并连接到它进行请求,而不是重复调用该程序作为命令行。您可以查看连接接口,例如SQLite,以获取灵感。


你说得很对,但不幸的是,sox似乎不能作为服务器守护进程运行。至少我没有发现这个功能。 - Mattias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接