2009-01-16 2 views
145

Mögliche Duplizieren:
Calling an external command in PythonProgramme Ausführen von Befehlszeile aus Python

Ich bin den Aufbau einer Web-Anwendung, die manipulieren wird sich (Pad, mischen, mischen etc.) Ton Dateien und ich habe festgestellt, dass sox genau das tut, was ich will. Sox ist ein Linux-Kommandozeilenprogramm und ich fühle mich ein wenig unbehaglich, wenn die Python-Webanwendung neue Sox-Prozesse auf meinem Server auf Anfrage startet.

Beispiel:

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

Das ganze Setup scheint ein wenig zu mir instabil.

Also meine Frage ist, was ist die beste Vorgehensweise für die Ausführung von Befehlszeilenprogrammen aus einer Python (oder einer Skriptsprache) Web App?

Nachrichtenwarteschlangen wären eine Sache, die implementiert werden muss, um den gesamten Antwortreaktionszyklus zu umgehen. Aber gibt es andere Möglichkeiten, diese Dinge eleganter zu machen?

+2

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

+0

@ S.Lott Nicht ganz, da es viel spezifischer für den Web-Server/Web-Anwendungskontext ist. – ThomasH

+1

@Thomas. Ich kann nicht sehen, wie "Web" in diesem Fall etwas ändert. Können Sie erklären, warum "Web" beim Ausführen eines Subprozesses wichtig ist? –

Antwort

142

Das subprocess-Modul ist die bevorzugte Möglichkeit, andere Programme von Python auszuführen - viel flexibler und netter zu verwenden als os.system.

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

Gibt es eine Chance, dass Sie einige Beispiele für seine Verwendung hinzufügen könnten? (zur Vollständigkeit) –

+6

Teilprozess importieren; subprocess.check_output (['ls', '-l']). für die Verwendung von ls -l in der Befehlszeile. check_output() gibt auch die Ausgabe des Befehls zurück. – eleijonmarck

2

Ich bin nicht vertraut mit Sox, aber anstatt wiederholte Aufrufe an das Programm als eine Befehlszeile, ist es möglich, es als einen Dienst einzurichten und eine Verbindung für Anfragen herzustellen? Sie können die Verbindungsschnittstelle wie sqlite für Inspiration betrachten.

+0

Sie sind genau richtig, aber leider läuft sox nicht als Server-Daemon. Zumindest nicht soweit ich das beurteilen kann. – Mattias

18

"Dieses ganze Setup scheint mir ein wenig instabil."

Sprechen Sie mit den ffmpegx Leuten über ein GUI-Front-End über ein Befehlszeilen-Backend. Es scheint sie nicht zu stören.

In der Tat, ich behaupte, dass eine GUI (oder Web) Front-End über eine Befehlszeile Backend ist tatsächlich stabiler, da Sie eine sehr, sehr saubere Schnittstelle zwischen GUI und Befehl haben. Der Befehl kann sich mit einer anderen Geschwindigkeit als das Web entwickeln, solange die Befehlszeilenoptionen kompatibel sind, besteht keine Möglichkeit eines Brechens.

4

Ich fühle mich ein wenig unwohl mit dem Python-Web-App mit neuen SOx Prozessen beginnend auf meinem Server pro Anfrage Basis.

Für mich scheint zu bedeuten, dass er befürchtet, dass, wenn er seinen Webserver für die Öffentlichkeit eröffnet, dass es nicht viel er von seinen Server-Ressourcen verhindern tun können, wenn 15.000 Menschen verbraucht wird entscheiden, klicken Sie auf Diese Schaltfläche, die auf diese Weise sox starten wird.

3

Wenn Sie über die Serverleistung besorgt sind, dann schauen Sie sich die Anzahl der laufenden Sox-Prozesse an. Wenn die Obergrenze erreicht wurde, können Sie die Anfrage immer zwischenspeichern und den Benutzer darüber informieren, wenn es fertig ist, je nachdem, wie es Ihrer Anwendung entspricht.

Alternativ können Sie die n worker-Skripts auf anderen Rechnern verwenden, die Anforderungen von der db abrufen und sox aufrufen, und dann die resultierende Ausgabedatei dorthin verschieben, wo sie sein muss.