2010-01-24 2 views
19

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

Редактировать: Это происходит из-за включения отладки при сборке библиотеки SDL.

+0

Теперь мне любопытно, что платформа вы используете (Linux дистрибутив?), И какой пакет вы используете? Или вы сами скомпилировали его? – Keith

+0

Это было давно, но я использовал Windows, Python 2.6 и Pygame 1.9 (включая SDL). Я только что ушел с установщиками Windows, и все было уже скомпилировано. – tankadillo

ответ

3

Вот соответствующий блок кода из 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) { 

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

+0

Как отключить отладку SDL, хотя Python? Google сообщает мне, что переменная окружения - 'SDL_DEBUG', но вставка' os.environ ['SDL_DEBUG'] = '0'' не имеет никакого эффекта. – tankadillo

+4

@jackson - это опция отладки времени компиляции для SDL. Сообщение печатает, потому что, когда ваша библиотека SDL была скомпилирована, был определен символ DEBUG. –

+0

А, ладно. Спасибо за помощь! – tankadillo

10

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

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

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

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

который восстанавливает стандартный вывод и ошибки в их первоначальную стоимость.

+0

Я раньше этого не знал. Кажется, это то, что я хочу, но когда я пытаюсь его использовать, функция get_hat() продолжает печатать на консоли. Может ли это быть проблемой с SDL? – tankadillo

+1

Использование держателей мест для исходных sys.stdout и sys.stderr для использования при восстановлении stdout расширит это решение для работы в ситуациях, когда «нестандартный» stdout уже установлен и должен быть сохранен после подавления. например, для использования в консоли python QGIS. –

+1

первый бит работает, однако даже с «восстановительным» битом кода я до сих пор не получаю никакого вывода на консоль после него? Я нахожусь на Ubuntu 14.04 с 3.4.3 – ashgetstazered

1

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

1

Как Demolishun упоминает в answer к закрытому дублирующему вопросу, есть thread, говорящий об этой проблеме. Тема с августа 2009 года, и один из разработчиков говорит the debug code was left in on accident. Я установил Pygame 1.9.1 из pip, и выход отладки все еще присутствует.

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

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

17

Просто для полноты картины, вот хорошее решение от Dave Smith's 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") 
0

Если вы на 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

2

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

import contextlib 

with contextlib.redirect_stdout(None): 
    do_thing() 

Для более полного объяснения чтения the docs

+1

Спасибо за подсказку. Вы также можете добавить оператор печати в качестве параметра в redirect_stdout(). 'с redirect_stdout (print ('Worked!')): do_thing()' – myidealab

Смежные вопросы