Как подавить вывод консоли в Python?
Я использую модуль джойстика Pygame/SDL для ввода ввода с геймпада. Каждый раз, когда я вызываю его метод get_hat()
, он выводит на консоль. Это проблематично, так как я использую консоль, чтобы помочь мне отлаживать, и теперь она заполняется с помощью SDL_JoystickGetHat value:0:
60 раз в секунду. Есть ли способ отключить это? Или через опцию в Pygame/SDL или подавить вывод консоли во время вызова функции? Я не упоминал об этом в документации Pygame.
edit:. Это связано с тем, что отладка включается при компиляции библиотеки SDL.
Ответы
Ответ 1
Здесь соответствующий блок кода из 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) {
Похоже, проблема с включением отладки.
Ответ 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
Привет
Макс