2010-04-09 8 views
5

J'ai un problème avec mon script python.Enregistreurs de silence et impression à l'écran - Python

Il imprime des quantités massives de données sur l'écran, et je voudrais empêcher toutes sortes d'impression à l'écran.


Edit:

La bibliothèque que je utilise est mécaniser, et il est l'impression d'un grand nombre de données sur l'écran.

Je les ai mis à false sans chance!

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

Toutes les idées?

L'aide serait incroyable et très appréciée!

+1

Pouvez-vous donner plus d'informations?De quel script parlez-vous? Quel type de données imprime-t-il? Pouvez-vous montrer du code? Utilisez-vous des scripts externes? – Ikke

Répondre

10

(Basé sur votre 2ème édition)

Si vous ne souhaitez pas désactiver toutes les sorties, vous pouvez essayer d'être spécifique à mechanize lui-même. http://wwwsearch.sourceforge.net/mechanize/ fournit un extrait, que j'ai modifié (bien que je ne suis pas sûr si cela va fonctionner):

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

Lorsque vous imprimez quelque chose, il passe à l'écran dans le fichier sys.stdout. Vous pouvez modifier ce fichier à tout autre fichier (par exemple, un fichier journal ouvert) de sorte que rien ne soit imprimé à l'écran:

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

Bien sûr, si vous parlez d'une bibliothèque que vous appelez , il peut être l'impression à sys.stderr. Heureusement, vous pouvez faire la même chose pour celui-ci (continue ci-dessus):

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

Maintenant, si, pour une raison quelconque, vous voulez ignorer complètement stdout (ou stderr) et ne jamais voir encore, vous pouvez définir vos propres classes comme fichier que simplement jeter les objets:

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

Et, d'ajouter le vacarme des solutions possibles, voici une solution qui fonctionne dans les shells Unix:

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

Merci pour la réponse AMAZING! Désolé pour la faute de frappe True/False – RadiantHex

2

Vous pouvez rediriger sys.std out et sys.stderr à un fichier ou un fichier comme objet de la vôtre, par exemple.

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

sys.stdout = EatLog() 

mais je ne recommanderais pas cela, une option plus simple consiste à utiliser la redirection de niveau OS par ex.

python myscript.py > out.log 
+1

et si vous avez besoin de rediriger stderr aussi (dans bash) 'python myscript.py 2> & 1> out.log' – cobbal

0

vous pouvez utiliser le module StringIO aussi, au lieu de rouler votre propre flux stdout. De temps en temps, le stdout a besoin de plus d'une méthode write (flush est une autre commune), que StringIO va gérer.

import StringIO 
import sys 

sys.stdout = StringIO.StringIO()