Какой простой способ реализовать параметр --quiet в скрипте Python - PullRequest
14 голосов
/ 29 ноября 2009

Я работаю над сценарием Python для командной строки - на протяжении всего сценария у меня есть много информации, которую я print обращаю к окну терминала, чтобы я мог следить за происходящим.

Используя OptionParser, я хочу добавить опцию --quiet, чтобы можно было замолчать весь вывод.Я ищу pythonic способ реализовать это на протяжении всего сценария, чтобы я не в итоге делал что-то вроде:

if not QUIET: # global variable set by OptionParser
    print " my output "

Я новичок в Python и уверен, что естьлучший способ.Идеи?

Ответы [ 6 ]

28 голосов
/ 29 ноября 2009

Вы можете использовать logging и назначать те вещи, которые не должны быть напечатаны, если QUIET другой уровень журнала.

Редактировать: Ответ THC4K показывает пример того, как это сделать, предполагая, что все выходные данные должны быть беззвучными, если установлена ​​QUIET. Обратите внимание, что в Python 3 from __future__ import print_function нет необходимости:

print = logging.info
logging.basicConfig(level=logging.WARNING if QUIET else logging.INFO,
                    format="%(message)s")

Для важных выходных данных, которые не должны заглушаться --quiet, определите, например, iprint

iprint = logging.warning
11 голосов
/ 29 ноября 2009

может отключить все выход, запустив его как python myscript.py > /dev/null

изменить выходные потоки в скрипте:

if QUIET:
    sys.stdout = open(os.devnull,'a')
    sys.stderr = open(os.devnull,'a')
print something

использовать другую функцию печати

from __future__ import print_function
if QUIET:
    def print(*args):
        pass
print( something )

использовать логирование и уровни логирования

from __future__ import print_function
import logging
logging.basicConfig(level=logging.INFO, format="%(message)s")
print = logging.info
if QUIET:
    logging.basicConfig(level=logging.ERROR)

print( something )
2 голосов
/ 29 ноября 2009

Почему бы вам просто не изменить свою функцию вывода в зависимости от того, находится ли программа в тихом режиме, поэтому вы делаете проверку только один раз?

if QUIET:
    def DoOutput(stuff):
        pass
else:
    def DoOutput(stuff):
        print(stuff)

Или, конечно, вы можете поставить проверку для QUIET внутри вашей функции вывода:

def DoOutput(stuff):
    if QUIET:
        print(stuff)

Ситуация, которую вы описали, на самом деле является одной из причин того, что Python 3 изменил print с ключевого слова на фактическую функцию: большие проекты людей очень сильно зависели от print, являющегося ключевым словом, а затем пришло время изменить способ записи, потребовался масштабный рефакторинг; тогда как когда print является надлежащей функцией, вы можете просто переопределить ее, чтобы, например, print(foo) выводил в файл журнала. Вот почему лучше обернуть вывод / запись в реальную функцию, а не разбрасывать print по вашему сценарию.

1 голос
/ 29 ноября 2009

Вы можете заменить стандартный вывод прокси, который фильтрует вызовы для записи или записи:

class FileProxy(object):
    def __init__(self, real_file, quiet_flag):
        self.real_file = real_file
        self.quiet_flag = quiet_flag

    def write(self, string):
        if not self.quiet_flag:
            self.real_file.write(string)

    def writelines(self, strings):
        if not self.quiet_flag:
            self.real_file.write(strings)

    def __getattr__(self, name):
        return getattr(self.file, name)

import sys
sys.stdout = FileProxy(sys.stdout, QUIET)

Преимущество этого в том, что он кроссплатформенный (в отличие от записи в / dev / null), и он все равно будет работать для операторов печати в сторонних библиотеках, которые вы не можете контролировать. Вы также можете уточнить его, чтобы дать больше контроля над тем, что написано, например, добавить отметку времени или перенаправить операторы печати в систему ведения журнала.

0 голосов
/ 29 ноября 2009
if QUIET:
   sys.stdout=open("/dev/null","w")
...
print 'my output'

В Windows используйте «nul» вместо «/ dev / null»

0 голосов
/ 29 ноября 2009

Если вы хотите быстро и грязно и хотите избавиться от вывода all , перенаправьте stdout и stderr в / dev / null. Помещенный:

sys.stdout = open("/dev/null", "a")
sys.stderr = open("/dev/null", "a")

В точке, где вы обнаруживаете --quiet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...