Какой простой способ реализовать параметр -quiet в python script
Я работаю над командной строкой python script - на всем протяжении script, у меня есть много информации, я print
-инг в окне терминала, чтобы я мог следовать вместе с тем, что происходит.
Используя OptionParser
, я хочу добавить параметр --quiet
, чтобы я мог отключить весь вывод. Я ищу питоновский способ реализовать это на протяжении script, чтобы я не делал что-то вроде:
if not QUIET: # global variable set by OptionParser
print " my output "
Являюсь новым для python и уверен, что есть лучший способ. Идеи?
Ответы
Ответ 1
Вы можете использовать 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
Ответ 2
может отключить все вывод, запустив его как python myscript.py > /dev/null
измените выходные потоки в script:
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 )
Ответ 3
Почему бы вам просто не изменить свою выходную функцию в зависимости от того, находится ли программа в тихом режиме, поэтому вы выполняете только один раз?
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
разбросано вокруг вашего script.
Ответ 4
Вы можете заменить 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 ), и она все равно будет работать для операторов печати в сторонних библиотеках, которые у вас нет.
Вы также можете уточнить его, чтобы дать больше контроля над тем, что написано, например. добавить временную метку или перенаправить операции печати в систему ведения журнала.
Ответ 5
Если вы хотите, чтобы это было быстро и грязно, и вы хотите избавиться от всех выходных данных, то перенаправление stdout и stderr на /dev/null. Помещенный:
sys.stdout = open("/dev/null", "a")
sys.stderr = open("/dev/null", "a")
В точке, где вы обнаруживаете --quiet.
Ответ 6
if QUIET:
sys.stdout=open("/dev/null","w")
...
print 'my output'
В Windows используйте "nul" вместо "/dev/null"