【问题标题】:Executing command line programs from within python [duplicate]从python中执行命令行程序[重复]
【发布时间】:2010-10-01 19:21:01
【问题描述】:

我正在构建一个 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(或任何脚本语言)网络应用程序中运行命令行程序的最佳做法是什么?

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

【问题讨论】:

  • > 我感觉有点不舒服 > 有 python 网络应用程序 > 在我的服务器上启动新的 sox 进程 > 根据每个请求。对我来说,这似乎意味着他担心,如果他向公众开放他的网络服务器,如果 15.000 人决定点击那个将启动 sox 的按钮,他将无能为力来防止他的服务器资源被消耗。以这种方式。
  • @Thomas。在这种情况下,我看不出“网络”如何改变任何东西。你能解释一下为什么“web”在运行子进程时很重要吗?
  • @S.Lott OP 表达了对基于每个请求启动子进程的关注。因此,这不仅涉及启动子流程,还涉及例如关于限制他们的总数。
  • @ThomasH:“限制他们的总数”?看起来更像是一个网站的请求响应很快,但这个子过程可能很慢。很难说。我不明白其他参考文献是如何不相关的。

标签: python command-line


【解决方案1】:

subprocess 模块是从 Python 运行其他程序的首选方式——比os.system 更灵活、更易于使用。

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

【讨论】:

  • 导入子流程; subprocess.check_output(['ls', '-l'])。用于在命令行中使用 ls -l。 check_output() 也返回命令的输出。
  • 使用subprocess.check_call(['ls','-l'])你不需要打印输出。
  • 使用os有什么问题?
  • 如果我想通过管道传输东西怎么办? pip list | grep anatome?
【解决方案2】:

整个设置对我来说似乎有点不稳定。

ffmpegx 的人们讨论在命令行后端上使用GUI 前端。这似乎并没有打扰他们。

确实,我认为GUI(或 Web)前端比命令行后端更稳定,因为您在 GUI 和命令之间有一个非常非常干净的界面。该命令可以以与网络不同的速度发展,只要命令行选项兼容,就没有损坏的可能性。

【讨论】:

    【解决方案3】:

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

    或者,在其他机器上拥有 n 个工作脚本,从数据库中拉取请求并调用 sox,然后将生成的输出文件推送到它需要的位置。

    【讨论】:

      【解决方案4】:

      我对 sox 不熟悉,但是与其将程序作为命令行重复调用,是否可以将其设置为服务并连接到它以获取请求?大家可以看看sqlite之类的连接界面找灵感。

      【讨论】:

      • 你是正确的,但不幸的是 sox 没有作为服务器守护进程运行。至少据我所知没有。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      相关资源
      最近更新 更多