Безмолвные регистраторы и печать на экран - Python - PullRequest
8 голосов
/ 09 апреля 2010

У меня проблема с моим скриптом Python.

Он печатает огромные объемы данных на экране, и я хотел бы запретить все виды печати на экране.


Edit:

Я использую библиотеку mechanize , и она выводит на экран МНОГО данных на экране.

Я установил их на ложь без удачи!

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

Есть идеи?

Помощь была бы удивительной и очень ценилась!

Ответы [ 3 ]

11 голосов
/ 09 апреля 2010

(на основании вашего второго редактирования)

Если вы не хотите отключать все выходные данные, вы можете попытаться указать только mechanize. http://wwwsearch.sourceforge.net/mechanize/ предоставляет фрагмент, который я модифицировал (хотя я не уверен, будет ли он работать):

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

Когда вы печатаете что-то, оно выходит на экран через файл sys.stdout. Вы можете изменить этот файл на любой другой файл (например, файл журнала, который вы открываете), чтобы ничего не выводилось на экран:

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

Конечно, если вы говорите о какой-то библиотеке, которую вы вызываете, она может печатать на sys.stderr. К счастью, вы можете сделать то же самое для этого (продолжая сверху):

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

Теперь, если по какой-то причине вы хотите полностью игнорировать stdout (или stderr) и больше никогда его не видеть, вы можете определить свои собственные файловые классы, которые просто отбрасывают объекты:

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

И, чтобы добавить к шуму возможных решений, вот решение, которое работает в оболочках Unix:

# discards all input (change /dev/null to a file name to keep track of output)
python yourScript.py > /dev/null
2 голосов
/ 09 апреля 2010

Вы можете перенаправить sys.stdout и sys.stderr в файл или любой файл, подобный вашему объекту, например,

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

sys.stdout = EatLog()

но я бы не рекомендовал, что более простой вариант - использовать перенаправление на уровне ОС, например

python myscript.py > out.log
0 голосов
/ 09 апреля 2010

вы также можете использовать модуль StringIO вместо того, чтобы использовать собственный поток stdout. Иногда stdout требуется больше, чем write метод (flush - еще один распространенный метод), который StringIO будет обрабатывать.

import StringIO
import sys

sys.stdout = StringIO.StringIO()
...