336 Stimmen

Ausführen von Kommandozeilenprogrammen aus Python heraus

Ich baue eine Webanwendung, die Sounddateien bearbeiten (auffüllen, mischen, zusammenführen usw.) wird, und ich habe festgestellt, dass sox macht genau das, was ich will. Sox ist ein Linux-Befehlszeilenprogramm und ich fühle mich ein wenig unwohl damit, dass die Python-Webanwendung neue Sox-Prozesse auf meinem Server auf einer Anfrage-Basis startet.

Beispiel:

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

Das ganze System scheint mir ein wenig instabil zu sein.

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

Nachrichtenwarteschlangen wären eine Möglichkeit, den gesamten Anfrage-Antwort-Zyklus zu umgehen. Aber gibt es andere Möglichkeiten, diese Dinge eleganter zu gestalten?

323voto

dF. Punkte 70587

En subprocess Modul ist der bevorzugte Weg, um andere Programme von Python aus zu starten -- viel flexibler und angenehmer zu benutzen als os.system .

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

28voto

S.Lott Punkte 371691

Das ganze System scheint mir ein wenig instabil zu sein.

Sprechen Sie mit dem ffmpegx Leute, die einen GUI Front-End über ein Kommandozeilen-Back-End. Das scheint sie nicht zu stören.

Ich behaupte in der Tat, dass ein GUI (oder Web-)Frontend über ein Befehlszeilen-Backend ist eigentlich stabiler, da man eine sehr, sehr saubere Schnittstelle zwischen GUI und Befehl. Der Befehl kann sich in einem anderen Tempo entwickeln als das Web. Solange die Befehlszeilenoptionen kompatibel sind, besteht keine Gefahr eines Bruchs.

3voto

Dale Reidy Punkte 1141

Wenn Sie sich Sorgen um die Serverleistung machen, sollten Sie die Anzahl der laufenden Sox-Prozesse begrenzen. Wenn die Obergrenze erreicht ist, können Sie die Anfrage zwischenspeichern und den Benutzer auf eine für Ihre Anwendung geeignete Weise informieren, wenn sie beendet ist.

Alternativ können Sie n Worker-Skripte auf anderen Rechnern installieren, die Anfragen aus der Datenbank abrufen und sox aufrufen, und dann die resultierende Ausgabedatei dorthin schieben, wo sie benötigt wird.

2voto

z - Punkte 7060

Ich kenne mich mit sox nicht aus, aber ist es möglich, das Programm als Dienst einzurichten und sich mit ihm für Anfragen zu verbinden, anstatt es wiederholt über die Befehlszeile aufzurufen? Sie können einen Blick auf die Verbindungsschnittstelle werfen, z. B. sqlite zur Inspiration.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X