Duplicate possible:
Appel d'une commande externe en Python
Je construis une application Web qui va manipuler (pad, mixer, fusionner, etc.) des fichiers sonores et j'ai trouvé que sox fait exactement ce que je veux. Sox est un programme de ligne de commande Linux et je me sens un peu mal à l'aise lorsque l'application Web python démarre de nouveaux processus sox sur mon serveur, requête par requête.
Exemple:
import os
os.system('sox input.wav -b 24 output.aiff rate -v -L -b 90 48k')
Toute cette configuration me semble un peu instable.
Ma question est donc la suivante: quelle est la meilleure pratique pour exécuter des programmes de ligne de commande à partir d'une application Web python (ou de tout langage de script)?
Les files de messages seraient une chose à implémenter afin de contourner tout le cycle de réponse à la demande. Mais existe-t-il d'autres moyens de rendre ces choses plus élégantes?
Le module subprocess
est le moyen privilégié d’exécuter d’autres programmes à partir de Python - beaucoup plus souple et plus convivial à utiliser que os.system
.
import subprocess
#subprocess.check_output(['ls','-l']) #all that is technically needed...
print subprocess.check_output(['ls','-l'])
"Toute cette configuration me semble un peu instable."
Parlez aux gens de ffmpegx à propos de l’interface graphique avec une interface en ligne de commande. Cela ne semble pas les déranger.
En effet, j’affirme qu’un interface graphique (ou Web) sur un serveur en ligne de commande est en réalité plus stable, car vous disposez d’une interface très, très claire entre l’interface graphique et la commande. La commande peut évoluer à un rythme différent de celui du Web, tant que les options de ligne de commande sont compatibles, vous ne pouvez pas vous casser.
Si vous êtes préoccupé par les performances du serveur, envisagez de limiter le nombre de processus sox en cours d'exécution. Si la limite a été atteinte, vous pouvez toujours mettre en cache la demande et informer l'utilisateur de la fin de la procédure, de la manière qui convient le mieux à votre application.
Vous pouvez également utiliser les scripts n worker sur d’autres ordinateurs pour extraire les demandes de la base de données et appeler sox, puis transférer le fichier de sortie résultant à l’endroit où il doit se trouver.
Je ne connais pas bien sox, mais au lieu de faire des appels répétés au programme en tant que ligne de commande, est-il possible de le configurer en tant que service et de s'y connecter pour les demandes? Vous pouvez jeter un coup d’œil sur l’interface de connexion telle que sqlite pour vous inspirer.