2009-01-16 5 views
145

Possible en double:
Calling an external command in Pythonexécution des programmes de ligne de commande à partir de python

Je construis une application web qui va manipuler (pad, mélanger, fusionner, etc.) son fichiers 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 avec l'application web python qui lance de nouveaux processus sox sur mon serveur, à la demande.

Exemple:

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

Cette configuration entière me semble un peu instable. Donc, ma question est, quelle est la meilleure pratique pour exécuter des programmes en ligne de commande à partir d'une application web python (ou n'importe quel langage de script)?

Les files d'attente de messages seraient une chose à implémenter afin de contourner l'ensemble du cycle de réponse aux demandes. Mais y a-t-il d'autres façons de rendre ces choses plus élégantes?

+2

connexes: http://stackoverflow.com/questions/89228/how-to-call-external-command-in-python, http://stackoverflow.com/questions/311601/python-as-a-batch -script-ie-run-commandes-from-python –

+0

@ S.Lott Pas tout à fait, car il est beaucoup plus spécifique au contexte serveur web/application web. – ThomasH

+1

@Thomas. Je ne peux pas voir comment "web" change quoi que ce soit dans ce cas. Pouvez-vous expliquer pourquoi "web" est important lors de l'exécution d'un sous-processus? –

Répondre

142

Le module subprocess est le moyen préféré d'exécuter d'autres programmes à partir de Python - beaucoup plus souple et plus agréable à utiliser que os.system.

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

Avez-vous des chances d'inclure des exemples de son utilisation? (pour l'exhaustivité) –

+6

sous-processus d'importation; subprocess.check_output (['ls', '-l']). pour utiliser ls -l dans la ligne de commande. check_output() retourne la sortie de la commande aussi. – eleijonmarck

2

Je ne suis pas familier avec 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 des demandes? Vous pouvez jeter un oeil à l'interface de connexion tels que sqlite pour l'inspiration.

+0

Vous êtes sur, mais malheureusement, sox ne fonctionne pas en tant que démon serveur. Au moins pas autant que je peux dire. – Mattias

18

"Cette installation entière semble un peu instable pour moi." Parlez aux ffmpegx aux gens d'avoir une interface graphique sur un backend de ligne de commande. Cela ne semble pas les déranger. En effet, je soumets qu'une interface graphique (ou web) sur un backend de ligne de commande est en fait plus stable, puisque vous avez une interface très, très propre entre l'interface graphique et la commande. La commande peut évoluer à un rythme différent du web, tant que les options de la ligne de commande sont compatibles, vous n'avez aucune possibilité de casse.

4

Je me sens un peu mal à l'aise d'avoir l'application web python à partir de nouveaux processus sox sur mon serveur sur une base par demande.

Pour moi, cela semble dire qu'il craint que, s'il ouvre son serveur Web au public, qu'il n'y a pas beaucoup qu'il peut faire pour empêcher ses ressources du serveur d'être consommé si 15.000 personnes décident de cliquer sur ce bouton qui lancera sox de cette façon.

3

Si vous êtes préoccupé par les performances du serveur, essayez 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 quand il est terminé, selon ce qui convient à votre application.

Alternativement, les scripts sont des travailleurs n sur d'autres machines qui tirent les demandes de la db et appellent sox, puis appuyez sur le fichier de sortie résultant à l'endroit où il doit être.

Questions connexes