Ejecutar programas de línea de comandos desde Python [duplicado]
Estoy creando una aplicación web que manipulará (rellene, mezclará, fusionará, etc.) archivos de sonido y descubrí que sox hace exactamente lo que quiero. Sox es un programa de línea de comandos de Linux y me siento un poco incómodo con que la aplicación web Python inicie nuevos procesos sox en mi servidor por solicitud.
Ejemplo:
import os
os.system('sox input.wav -b 24 output.aiff rate -v -L -b 90 48k')
Toda esta configuración me parece un poco inestable.
Entonces mi pregunta es, ¿cuál es la mejor práctica para ejecutar programas de línea de comandos desde una aplicación web Python (o cualquier lenguaje de programación)?
Las colas de mensajes serían una cosa a implementar para sortear todo el ciclo de respuesta de la solicitud. ¿Pero hay otras formas de hacer que estas cosas sean más elegantes?
El subprocess
módulo es la forma preferida de ejecutar otros programas desde Python: mucho más flexible y agradable de usar que os.system
.
import subprocess
#subprocess.check_output(['ls', '-l']) # All that is technically needed...
print(subprocess.check_output(['ls', '-l']))
Toda esta configuración me parece un poco inestable.
Hable con la gente de ffmpegx sobre tener una interfaz gráfica de usuario sobre un servidor de línea de comandos. No parece molestarles.
De hecho, sostengo que una interfaz gráfica de usuario (o web) sobre un servidor de línea de comandos es en realidad más estable, ya que tiene una interfaz muy, muy limpia entre la GUI y el comando. El comando puede evolucionar a un ritmo diferente al de la web, siempre y cuando las opciones de la línea de comandos sean compatibles, no tienes posibilidad de rotura.
Si le preocupa el rendimiento del servidor, considere limitar la cantidad de procesos sox en ejecución. Si se alcanzó el límite, siempre puede almacenar en caché la solicitud e informar al usuario cuando finalice de la forma que mejor se adapte a su aplicación.
Alternativamente, tenga los n scripts de trabajo en otras máquinas que extraigan solicitudes de la base de datos y llamen a sox, y luego envíen el archivo de salida resultante a donde debe estar.
No estoy familiarizado con sox, pero en lugar de realizar repetidas llamadas al programa como una línea de comando, ¿es posible configurarlo como un servicio y conectarme a él para realizar solicitudes? Puede echar un vistazo a la interfaz de conexión como sqlite para inspirarse.