Подавить вывод отладки pygame (вывод консоли)

По-видимому, у версии pygame, которую я использую, есть проблема, из-за которой операторы отладки были оставлены в - Как подавить вывод в консоль в Python? при использовании joystick.get_axis. Это проблема, но мне не удалось использовать методы, представленные в этих ответах. Каждый из методов по-прежнему печатал SDL_JoystickGetAxis value.

Я также попробовал этот блог но я все еще выводил на консоль. Думая, что это может быть проблема с stdout против stderr, я попытался подавить stdout, затем stderr, затем оба, но безрезультатно.

В основном мой код постоянно печатает SDL_JoystickGetAxis value:0 или любое другое значение оси. Как мне подавить эти отладочные операторы?

import os
import sys
from contextlib import contextmanager

@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

Позже в своем коде я использую эту функцию:

    if speedchange == False and headingchange == False:
        time.sleep(0.1)
        with suppress_stdout():
            speed_ax = joys.get_axis(1)
            head_ax = joys.get_axis(0)

Что по-прежнему выводит операторы отладки


person Murphy    schedule 15.09.2015    source источник
comment
Как вы используете код из блога?   -  person Ethan Bierlein    schedule 16.09.2015


Ответы (2)


Я не уверен, почему код из блога, на который вы указали ссылку, не работает, но вы всегда можете просто поместить это в начало своего кода:

sys.stdout = os.devnull
sys.stderr = os.devnull

Если вам нужно вывести сообщения об ошибках или что-то подобное, вы можете просто сделать это:

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

На всякий случай, если вы неправильно используете диспетчер контекста, связанный в блоге, вы должны использовать его следующим образом:

with suppress_stdout():
    # Do blah foo and bar here
person Ethan Bierlein    schedule 15.09.2015
comment
Я просто добавил к вопросу код, который использую. Я думаю, что использую код блога правильно, поэтому я не был уверен, имеют ли отладочные сообщения какие-то странные особые свойства. Я также попробовал ваше решение, вставив между ними joys.get_axis часть, которая также не сработала. - person Murphy; 16.09.2015

Это сработало для меня в Python 3.5 и Python 2.7.

import sys, os
stdout = sys.__stdout__
stderr = sys.__stderr__
print("start")
sys.stdout = open(os.devnull,'w')
sys.stderr = open(os.devnull,'w')
print("don't want")
sys.stdout = stdout
sys.stderr = stderr
print("want")

На выходе

start
want
person saulspatz    schedule 30.11.2015