Как подавить вывод консоли в Python? - PullRequest
25 голосов
/ 24 января 2010

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

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

Ответы [ 7 ]

28 голосов
/ 31 июля 2014

Просто для полноты, вот хорошее решение из блога Дэйва Смита :

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")
12 голосов
/ 24 января 2010

Вы можете обойти это, назначив стандартное 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__

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

7 голосов
/ 03 сентября 2017

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

import contextlib

with contextlib.redirect_stdout(None):
    do_thing()

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

4 голосов
/ 24 января 2010

Вот соответствующий блок кода из joystick.c (через SVN на http://svn.seul.org/viewcvs/viewvc.cgi/trunk/src/joystick.c?view=markup&revision=2652&root=PyGame)

    value = SDL_JoystickGetHat (joy, _index);
#ifdef DEBUG
    printf("SDL_JoystickGetHat value:%d:\n", value);
#endif
    if (value & SDL_HAT_UP) {

Похоже, проблема с включенной отладкой.

1 голос
/ 25 ноября 2012

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

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

Я нахожусь на OS X 10.7.5 для того, что это стоит.

1 голос
/ 21 февраля 2011

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

0 голосов
/ 15 апреля 2016

Если вы работаете на компьютере с 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

Поздравления Max

...