Самый питонный способ игнорировать вывод - PullRequest
2 голосов
/ 26 ноября 2009

У меня есть класс, который использует протокол управления контекстами, чтобы некоторое время иметь поток без вывода сообщений stderr (в основном используется для развертываний py2exe, когда приложение, записывающее что-либо в stderr, вызывает уродливые диалоги, когда приложение закрывается, и я ' я делаю что-то, что я знаю, будет иметь какой-то вывод stderr)

import sys
import os
from contextlib import contextmanager

@contextmanager
def noStderr():
    stderr = sys.stderr
    sys.stderr = open(os.devnull, "w")
    yield
    sys.stderr = stderr

Мой вопрос заключается в том, что было бы более питонным, разумно чистым решением открытия системного бита и записи в него или пропуска выделения операций fd и write и создания нового класса ala:

class nullWriter(object):
    def write(self, string):
        pass

, а затем заменить указанный выше код на

from contextlib import contextmanager

@contextmanager
def noStderr():
    stderr = sys.stderr
    sys.stderr = nullWriter()
    yield
    sys.stderr = stderr

Ответы [ 5 ]

4 голосов
/ 26 ноября 2009

Я думаю, что последнее решение является более элегантным. Вы избегаете попадания в системную среду, потенциально тратя впустую fd. Зачем выходить из операционной системы, когда она не нужна?

3 голосов
/ 26 ноября 2009

Мне кажется, что класс nullWriter был бы более "Pythonic", потому что он использует уже существующие интерфейсы Python (что вы можете назначить sys.stderr для всего, что имеет метод записи), а не выходить в систему окружения и пишите в «ведро с битами», как вы это выразили:)

2 голосов
/ 26 ноября 2009

Это решение между использованием вещей, которые уже существуют (os.devnull), но немного «грязнее» (вам нужно open() это и т. Д.), И созданием собственного решения, которое может быть проще, но это новый класс, который вы создаете.

Хотя и то, и другое прекрасно, я бы пошел с nullWriter, так как он чище и зависит от чистых знаний Python и не портит все остальное.

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

Что с этим не так?

import sys

sys.stderr = open('/dev/null', 'w')
0 голосов
/ 26 ноября 2009

Спасибо всем за ответы.

Я думаю, что я пойду с подходом nullWriter. Я знаю, что оба варианта работают, но мне больше интересно посмотреть, что кажется чище (особенно если затраты на открытие файла пренебрежимо малы).

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