Инициирование отображения 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()
Однако вы не можете использовать модуль событий, поскольку он привязан к модулю дисплея.