web-dev-qa-db-fra.com

Exécution de programmes en ligne de commande depuis python

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?

251
Mattias

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'])
240
dF.

"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.

22
S.Lott

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.

2
Dale Reidy

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.

2
z -