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

Как подавить вывод консоли в Python?

Я использую модуль джойстика Pygame/SDL для ввода ввода с геймпада. Каждый раз, когда я вызываю его метод get_hat(), он выводит на консоль. Это проблематично, так как я использую консоль, чтобы помочь мне отлаживать, и теперь она заполняется с помощью SDL_JoystickGetHat value:0: 60 раз в секунду. Есть ли способ отключить это? Или через опцию в Pygame/SDL или подавить вывод консоли во время вызова функции? Я не упоминал об этом в документации Pygame.

edit:. Это связано с тем, что отладка включается при компиляции библиотеки SDL.

4b9b3361

Ответ 2

Просто для полноты, вот хорошее решение из Dave Smith blog:

from contextlib import contextmanager
import sys, os

@contextmanager
def suppress_stdout():
    with open(os.devnull, "w") as devnull:
        old_stdout = sys.stdout
        sys.stdout = devnull
        try:  
            yield
        finally:
            sys.stdout = old_stdout

С помощью этого вы можете использовать управление контекстом везде, где хотите подавить вывод:

print("Now you see it")
with suppress_stdout():
    print("Now you don't")

Ответ 3

Вы можете обойти это, назначив стандартное out/error (я не знаю, к какому из них это приведет) к нулевому устройству. В Python стандартными файлами out/error являются sys.stdout/sys.stderr, а нулевым устройством является os.devnull, поэтому вы делаете

sys.stdout = open(os.devnull, "w")
sys.stderr = open(os.devnull, "w")

Это должно полностью отключить эти сообщения об ошибках. К сожалению, это также отключит весь вывод консоли. Чтобы обойти это, отключите вывод прямо перед вызовом get_hat(), а затем восстановите его, выполнив

sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__

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

Ответ 4

Для завершения ответа charles в python встроены два диспетчера контекста, redirect_stdout и redirect_stderr которые вы можете использовать для перенаправления и/или подавления вывода команд в файл или переменную StringIO.

import contextlib

with contextlib.redirect_stdout(None):
    do_thing()

Для более полного объяснения прочитайте документы

Ответ 5

Я использую pythonw.exe(в Windows) вместо python.exe. В других операционных системах вы также можете перенаправить вывод в /dev/nul. И для того, чтобы все еще видеть мой вывод отладки, я использую модуль протоколирования.

Ответ 6

Поскольку Demolishun упоминает в ответе закрытый вопрос с дубликатом, существует об этой проблеме. Поток с августа 2009 года, и один из разработчиков говорит код отладки был оставлен при аварии. Я установил Pygame 1.9.1 из pip, и выход отладки все еще присутствует.

Чтобы обойти это сейчас, я загрузил источник с pygame.org, удалил инструкции печати из src/joystick.c и скомпилировал код.

Я на OS X 10.7.5 за то, что он стоит.

Ответ 7

Если вы находитесь на машине Debian или Ubuntu, вы можете просто перекомпилировать pygame без сообщений.

cd /tmp
sudo apt-get build-dep pygame
apt-get source pygame
vim pygame-1.9.1release+dfsg/src/joystick.c
# search for the printf("SDL.. messages and put a // in front
apt-get source --compile pygame
sudo dpkg -i python-pygame_1.9.1release+dfsg-9ubuntu1_amd64.deb

Привет Макс