Выполнение программ командной строки из python - программирование

Выполнение программ командной строки из python

Возможный дубликат:
Вызов внешней команды в Python

Я создаю веб-приложение, которое будет обрабатывать звуковые файлы (pad, mix, merge etc), и я обнаружил, что sox делает именно то, что я хочу. Sox - это программа командной строки linux, и мне немного неудобно, когда веб-приложение python запускает новые процессы sox на моем сервере для каждого запроса.

Пример:

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

Вся эта настройка кажется мне немного неустойчивой.

Итак, мой вопрос: какая наилучшая практика для запуска программ командной строки из веб-приложения python (или любого скриптового языка)?

Очереди сообщений будут реализованы для того, чтобы обойти весь цикл ответа на запрос. Но есть ли другие способы сделать эти вещи более элегантными?

4b9b3361

Ответ 1

Модуль subprocess является предпочтительным способом запуска других программ с Python - гораздо более гибким и приятным в использовании, чем os.system,

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

Ответ 2

"Вся эта настройка кажется мне немного неустойчивой".

Поговорите с ffmpegx о том, чтобы иметь интерфейс GUI поверх бэкэнда командной строки. Кажется, это их не беспокоит.

Действительно, я утверждаю, что интерфейс GUI (или веб-интерфейса) поверх бэкэнда из командной строки на самом деле более стабилен, поскольку у вас очень чистый интерфейс между графическим интерфейсом и командой. Команда может развиваться в другом темпе из Интернета, если параметры командной строки совместимы, у вас нет возможности поломки.

Ответ 3

Мне немного неудобно с веб-приложением python запуск новых процессов sox на моем сервер на основе запроса.

Для меня это, похоже, означает, что он опасается, что, если он откроет свой веб-сервер для публики, он не сможет много сделать, чтобы предотвратить использование его ресурсов сервера, если 15 000 человек решат нажать на эту кнопку, будет запускать sox таким образом.

Ответ 4

Я не знаком с sox, но вместо повторных вызовов программы в качестве командной строки можно ли настроить ее как службу и подключиться к ней для запросов? Вы можете взглянуть на интерфейс соединения, такой как sqlite для вдохновения.

Ответ 5

Если вы беспокоитесь о производительности сервера, посмотрите на количество запущенных процессов sox. Если кепка была удалена, вы всегда можете кэшировать запрос и сообщать пользователю, когда он закончил, в зависимости от того, какой вариант подходит вашему приложению.

Кроме того, у вас есть n рабочих сценариев на других машинах, которые извлекают запросы из db и вызывают sox, а затем выталкивают полученный выходной файл туда, где он должен быть.