Инициирование отображения Pygame на Raspberry Pi Zero без головы (Raspbian Buster Lite)

У меня Pi Zero под управлением Raspbian Buster Lite, дисплей не прикреплен. При запуске он запускает программу на python (запись crontab @reboot), примерно так:

@reboot sudo su username /home/username/launcher.sh >> /home/username/crontab.log 2>&1

Я должен инициализировать отображение pygame, потому что мне нужно обработать конечные события объекта Sound. Без инициализации отображения события не инициируются.

Код прерывается в этой строке с ошибкой "pygame.error: Невозможно открыть консольный терминал"

    os.putenv('SDL_VIDEODRIVER', 'dummy')
    pygame.display.init()  # error at this line

Мой код работал в предыдущей версии Raspbian (Stretch). Я экспериментировал со всеми видами драйверов, добавил / удалил pygame.display.set_mode((1, 1)), но не повезло.

Мне известны другие посты, посвященные тому же вопросу, но я исчерпал все эти подходы - изменив драйвер на fbcon, пропустив строку set_mode и т. Д. Единственное, что работает, это запуск программы от имени root:

@reboot /home/username/launcher.sh >> /home/username/crontab.log 2>&1

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

Есть ли новый вид взломать, чтобы пройти через display.init()?

1 ответ

pygame.initинициализирует все модули Pygame. Вам не нужно инициализировать все модули Pygame, только те, которые вам нужны. Для воспроизведения музыки достаточно инициализироватьpygame.mixer. Некоторые примеры

      import pygame

pygame.mixer.init()
pygame.mixer.music.load('music.mp3')
pygame.mixer.music.play()

while pygame.mixer.music.get_busy():
   pygame.time.delay(10)

pygame.mixer.quit()
      import pygame

pygame.mixer.init()
my_sound = pygame.mixer.Sound('music.mp3')
my_sound.play(0)

while pygame.mixer.get_busy():
    pygame.time.delay(10)

pygame.quit()
      import pygame.mixer

pygame.mixer.init()
my_sound = pygame.mixer.Sound('sound.wav')
my_sound.play(0)
pygame.time.wait(int(my_sound.get_length() * 1000))

pygame.mixer.quit()

Однако вы не можете использовать модуль событий, поскольку он привязан к модулю дисплея.

Другие вопросы по тегам