Подтвердить что ты не робот

Какой простой способ реализовать параметр -quiet в python script

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

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

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

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

4b9b3361

Ответ 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"