2010-04-09 4 views
5

Ich habe ein Problem mit meinem Python-Skript.Schweigen Logger und Drucken auf dem Bildschirm - Python

Es wird große Mengen von Daten auf dem Bildschirm drucken, und ich möchte verhindern, dass alle Arten von Drucken auf dem Bildschirm angezeigt werden.


Edit:

Die Bibliothek ich benutze ist mechanisieren, und es wird Druck eine Menge Daten auf dem Bildschirm.

Ich habe diese auf falsch gesetzt, ohne Glück!

br.set_debug_redirects(False) 
br.set_debug_responses(False) 
br.set_debug_http(False) 

Irgendwelche Ideen?

Hilfe wäre toll und sehr geschätzt!

+1

Können Sie weitere Informationen geben?Von welchem ​​Skript sprichst du? Welche Art von Daten wird gedruckt? Kannst du etwas Code zeigen? Verwenden Sie externe Skripts? – Ikke

Antwort

10

(Basierend auf dem zweiten edit)

Wenn Sie alle Ausgaben nicht deaktivieren möchten, können Sie versuchen, mechanize sich um genau zu sein. http://wwwsearch.sourceforge.net/mechanize/ ein Schnipsel, die ich geändert habe (obwohl ich nicht sicher bin, ob es funktionieren wird):

import logging 
logger = logging.getLogger("mechanize") 
# only log really bad events 
logger.setLevel(logging.ERROR) 

Wenn Sie etwas ausdrucken auf dem Bildschirm durch die sys.stdout Datei geht. Sie können diese Datei in eine andere Datei ändern (zB eine Log-Datei, die Sie öffnen), so dass nichts auf dem Bildschirm ausgegeben wird:

import sys 
# save the old stdout so you can print later (do sys.stdout = OLD_STDOUT) 
OLD_STDOUT = sys.stdout 
sys.stdout = open("logfile.txt", 'w') 

Natürlich, wenn Sie über einige Bibliothek reden, die Sie anrufen Es kann unter sys.stderr gedruckt werden. Zum Glück kann man genau die gleiche Sache für diese tun (Fortsetzung von oben):

OLD_STDERR = sys.stderr 
sys.stderr = open("errorLog.txt", 'w') 

Nun, wenn aus irgendeinem Grund, möchten Sie ganz stdout ignorieren (oder stderr) und es nie wieder sehen, können Sie Ihre eigene Datei-wie Klassen definieren, die einfach die Objekte verwerfen:

class Discarder(object): 
    def write(self, text): 
     pass # do nothing 
# now discard everything coming out of stdout 
sys.stdout = Discarder() 

Und, um den Lärm der möglichen Lösungen hinzuzufügen, hier ist eine Lösung, die in Unix-Shells funktioniert:

# discards all input (change /dev/null to a file name to keep track of output) 
python yourScript.py > /dev/null 
+0

Danke für die erstaunliche Antwort! sorry über die True/False typo – RadiantHex

2

Sie können sys.std umleiten out und sys.stderr in eine Datei oder eine Datei wie Ihr Objekt, z.

aber ich würde nicht empfehlen, dass einfachere Option ist, OS-Level-Umleitung zu verwenden, z.

python myscript.py > out.log 
+1

und wenn Sie stderr auch (in bash) umleiten müssen 'python myscript.py 2> & 1> out.log' – cobbal

0

können Sie das StringIO Modul verwenden, auch anstelle des eigenen stdout Strom rollen. Gelegentlich benötigt der stdout mehr als eine write Methode (flush ist eine andere häufige), die StringIO verarbeiten wird.

import StringIO 
import sys 

sys.stdout = StringIO.StringIO() 
Verwandte Themen