Python: Wie unterdrückt man die Ausgabe von os.system?

8

Wenn ich in Python "wget" verwende, um eine Datei mit os.system ("wget") herunterzuladen, wird dies auf dem Bildschirm wie folgt angezeigt:

%Vor%

usw. auf dem Bildschirm.

Was kann ich tun, um diese Ausgabe in einer Datei zu speichern, anstatt sie auf dem Bildschirm anzuzeigen?

Momentan führe ich den Befehl wie folgt aus:

theurl="& lt; Speicherort der Datei & gt;"

downloadCmd="wget" + theurl

os.system (downloadCmd)

    
nsh 20.08.2011, 01:58
quelle

4 Antworten

5

Um Ihre direkte Frage zu beantworten und wie andere bereits erwähnt haben, sollten Sie das Modul Unterprozess in Betracht ziehen. Hier ist ein Beispiel:

%Vor%

Aber, keine Notwendigkeit, zum System aufzurufen, um eine Datei herunterzuladen, lassen Sie Python das schwere Heben für Sie erledigen.

Verwenden Sie urllib ,

%Vor%

Oder urllib2 ,

%Vor%

local_filename ist der Zielpfad Ihrer Wahl. Es ist manchmal möglich, diesen Wert automatisch zu bestimmen, aber der Ansatz hängt von Ihren Umständen ab.

    
Marty 20.08.2011, 02:56
quelle
20

Die os.system -Funktionen führen den Befehl über eine Shell aus, so dass Sie dort auch beliebige stdio-Weiterleitungen platzieren können. Sie sollten auch das -q -Flag (quiet) für wget verwenden.

%Vor%

Es gibt jedoch bessere Möglichkeiten, dies in Python zu tun, wie zum Beispiel den pycurl-Wrapper für libcurl oder das Modul "stock" urllib2 .

    
Keith 20.08.2011 02:15
quelle
1

Wie andere bemerkt haben, können Sie Pythons native Bibliotheksmodule für Ihre E / A verwenden oder Sie können die Befehlszeile ändern, um die Ausgabe umzuleiten.

Aber für die volle Kontrolle über die Ausgabe ist das beste, das Modul Python subprocess anstelle von os.system() zu verwenden. Mit subprocess können Sie die Ausgabe erfassen und untersuchen oder beliebige Daten in die Standardeingabe einspeisen.

Wenn Sie schnell und einfach etwas ausführen möchten, verwenden Sie os.system() . Wenn Sie die volle Kontrolle darüber haben möchten, wie Sie etwas ausführen, verwenden Sie subprocess .

    
steveha 20.08.2011 02:18
quelle
0

Der wget-Prozess schreibt gerade in STDOUT (und vielleicht STDERR, wenn etwas Schlimmes passiert) und diese sind immer noch mit dem Terminal "verkabelt".

Um das zu beenden, leiten Sie die Dateihandles um (oder schließen). Sehen Sie sich das Modul Subprozess an, mit dem Sie diese Dateihandles konfigurieren können, wenn Sie einen Prozess starten. ( os.system hinterlässt nur den STDOUT / STDERR des erzeugten Prozesses und wird daher vererbt, aber das Subprozessmodul ist flexibler.)

Siehe Arbeiten mit dem Python-Subprozess - Shells, Prozesse, Streams, Pipes, Redirects und mehr für viele schöne Beispiele und Erklärungen (es führt die Konzepte von STDIN / STDOUT / STDERR ein und funktioniert von dort).

Es gibt wahrscheinlich bessere Möglichkeiten, damit umzugehen als mit wget - aber ich überlasse das anderen Antworten.

Glückliche Kodierung.

    
user166390 20.08.2011 02:10
quelle

Tags und Links