Es gibt vier starke Fälle, in denen Pythons spezifischere Methoden im os
Modul gegenüber der Verwendung os.system
oder dem subprocess
Modul bei der Ausführung eines Befehls bevorzugt werden :
- Redundanz - Das Starten eines anderen Prozesses ist redundant und verschwendet Zeit und Ressourcen.
- Portabilität - Viele der Methoden im
os
Modul sind auf mehreren Plattformen verfügbar, während viele Shell-Befehle os-spezifisch sind.
- Grundlegendes zu den Ergebnissen - Wenn Sie einen Prozess zum Ausführen beliebiger Befehle erstellen, müssen Sie die Ergebnisse aus der Ausgabe analysieren und verstehen, ob und warum ein Befehl etwas falsch gemacht hat.
- Sicherheit - Ein Prozess kann möglicherweise jeden Befehl ausführen, den er erhält. Dies ist ein schwaches Design und kann durch Verwendung bestimmter Methoden im
os
Modul vermieden werden .
Sie führen tatsächlich einen redundanten "Middle-Man" auf dem Weg zu den eventuellen Systemaufrufen aus (chmod
in Ihrem Beispiel). Dieser mittlere Mann ist ein neuer Prozess oder eine neue Unterschale.
Von os.system
:
Führen Sie den Befehl (eine Zeichenfolge) in einer Subshell aus ...
Und subprocess
ist nur ein Modul, um neue Prozesse hervorzubringen.
Sie können tun, was Sie brauchen, ohne diese Prozesse zu erzeugen.
Das os
Ziel des Moduls ist die Bereitstellung allgemeiner Betriebssystemdienste. Die Beschreibung beginnt mit:
Dieses Modul bietet eine tragbare Möglichkeit zur Verwendung betriebssystemabhängiger Funktionen.
Sie können os.listdir
sowohl unter Windows als auch unter Unix verwenden. Wenn Sie versuchen, os.system
/ subprocess
für diese Funktionalität zu verwenden, müssen Sie zwei Aufrufe (für ls
/ dir
) beibehalten und überprüfen, auf welchem Betriebssystem Sie sich befinden. Dies ist nicht so portabel und wird später noch mehr Frustration verursachen (siehe Umgang mit der Ausgabe ).
Grundlegendes zu den Ergebnissen des Befehls:
Angenommen, Sie möchten die Dateien in einem Verzeichnis auflisten.
Wenn Sie os.system("ls")
/ verwendensubprocess.call(['ls'])
, können Sie nur die Ausgabe des Prozesses zurückerhalten. Dies ist im Grunde eine große Zeichenfolge mit den Dateinamen.
Wie können Sie eine Datei mit einem Leerzeichen im Namen von zwei Dateien unterscheiden?
Was ist, wenn Sie keine Berechtigung zum Auflisten der Dateien haben?
Wie sollten Sie die Daten Python-Objekten zuordnen?
Diese sind nur aus dem Kopf, und obwohl es Lösungen für diese Probleme gibt - warum sollte ich ein Problem, das für Sie gelöst wurde, erneut lösen?
Dies ist ein Beispiel für die folgenden nicht selbst wiederholen Prinzip (oft als „trocken“ reffered to) von nicht eine Implementierung zu wiederholen , die bereits vorhanden und ist für Sie frei zur Verfügung.
Sicherheit:
os.system
und subprocess
sind mächtig. Es ist gut, wenn Sie diese Kraft brauchen, aber es ist gefährlich, wenn Sie es nicht tun. Wenn Sie verwenden os.listdir
, wissen Sie, dass es nichts anderes tun kann, als Dateien aufzulisten oder einen Fehler auszulösen. Wenn Sie os.system
oder verwendensubprocess
dasselbe Verhalten erreichen, können Sie möglicherweise etwas tun, was Sie nicht wollten.
Einspritzsicherheit (siehe Beispiele für die Einspritzung der Schale ) :
Wenn Sie die Eingabe des Benutzers als neuen Befehl verwenden, haben Sie ihm im Grunde eine Shell gegeben. Dies ähnelt der SQL-Injection, die dem Benutzer eine Shell in der Datenbank bereitstellt.
Ein Beispiel wäre ein Befehl des Formulars:
# ... read some user input
os.system(user_input + " some continutation")
Dies kann leicht ausgeführt werden ausgebeutet jeden beliebigen Code mit der Eingabe: NASTY COMMAND;#
die schließliche zu erstellen:
os.system("NASTY COMMAND; # some continuation")
Es gibt viele solcher Befehle, die Ihr System gefährden können.