2010-04-09 13 views
5

Sto riscontrando un problema con il mio script python.Registratori di silenzio e stampa sullo schermo - Python

Stampa enormi quantità di dati sullo schermo e vorrei impedire la stampa di tutti i tipi di stampa.


Edit:

La biblioteca che sto utilizzando è Mechanize, ed è la stampa di una grande quantità di dati sullo schermo.

Ho impostato questi a falso senza fortuna!

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

Tutte le idee?

L'aiuto sarebbe fantastico e molto apprezzato!

+1

Puoi fornire ulteriori informazioni?Di quale sceneggiatura stai parlando? Che tipo di dati sta stampando? Puoi mostrare un po 'di codice? Stai usando script esterni? – Ikke

risposta

10

(Basato sul 2 ° edit)

Se non si desidera disattivare tutti gli output, si può provare a essere specifico per mechanize sé. http://wwwsearch.sourceforge.net/mechanize/ fornisce un frammento, che ho modificato (anche se non sono sicuro se funzionerà):

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

Quando si stampa qualcosa va allo schermo attraverso il file sys.stdout. È possibile modificare questo file per qualsiasi altro file (ad esempio, un file di log che si apre), in modo che nulla viene stampato sullo schermo:

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') 

Naturalmente, se si sta parlando di una libreria che si sta chiamando , può essere stampato su sys.stderr. Per fortuna, si può fare la stessa cosa per questo uno (continua dall'alto):

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

Ora, se, per qualche motivo, si vuole ignorare completamente l'output standard (stderr) e mai vedere di nuovo, si può definire le proprie classi di file-like che semplicemente scartare gli oggetti:

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

E, per aggiungere al frastuono delle possibili soluzioni, qui è una soluzione che funziona nelle shell di Unix:

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

Grazie per la risposta INCREDIBILE! mi dispiace per il vero/falso errore di battitura – RadiantHex

2

Si può reindirizza sys.std out e sys.stderr in un file o qualsiasi file come il tuo oggetto, ad es.

class EatLog(object): 
    def write(self): 
     pass 

sys.stdout = EatLog() 

ma non lo consiglierei, l'opzione più semplice è utilizzare il reindirizzamento del livello del sistema operativo ad es.

python myscript.py > out.log 
+1

e se hai bisogno di reindirizzare anche stderr (in bash) 'python myscript.py 2> & 1> out.log' – cobbal

0

è possibile utilizzare il modulo StringIO, troppo, invece di rotolare il proprio flusso stdout. Occasionalmente, lo stdout richiede più di un metodo write (flush è un altro comune), che verrà gestito da StringIO.

import StringIO 
import sys 

sys.stdout = StringIO.StringIO() 
Problemi correlati