Что такое простой способ реализации опции -quiet в скрипте python

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

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

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

Являюсь новым для python и уверен, что есть лучший способ. Идеи?

6 Solutions collect form web for “Что такое простой способ реализации опции -quiet в скрипте python”

Вы можете использовать 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") 

Для важного вывода, который не следует iprint , определите, например, iprint :

 iprint = logging.warning 

может отключить весь вывод, запустив его как 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 ) 

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

 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 на вашем скрипте.

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

 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), и она по-прежнему будет работать для операторов печати в сторонних библиотеках, которые у вас нет. Вы также можете уточнить его, чтобы дать больше контроля над тем, что написано, например, добавить временную метку или перенаправить операции печати в систему ведения журнала.

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

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

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

 if QUIET: sys.stdout=open("/dev/null","w") ... print 'my output' 

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

  • Нужно ли включать __init__ в качестве первой функции каждый раз в классе в Python?
  • Связь Bluetooth между Arduino и PyBluez
  • Установка pip на Mac OS дает разрешение на отказ: '/Library/Python/2.7/site-packages/pip
  • Импорт модулей из разных папок
  • Преобразовать двоичную строку базы-2 в int
  • Сообщение об ошибке «сообщение» Firebase: «PASSWORD_LOGIN_DISABLED» при попытке аутентификации
  • переопределить во время выполнения __setattr__
  • Использование Twill из Python для открытия ссылки: «Объект« module »не имеет атрибута« Popen »« Что это такое?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.