BLOGサブスレッドの日常
2018.12.06
PyGame over ssh on Raspberry Pi
tama
しわっす。tamaです。
Raspberry Pi にハマってるわけではなく、
仕事で Raspberry Pi 使ってたスタッフがハマってたのでそのフォローをしてたメモの第二弾です。
tty(コンソール)以外でも PyGame したいシーン
開発自体は母艦(っていう呼び方するのかな。いつも使ってるパソコン)でします。
でも動作確認は実機でします。
いちいちキーボード持ち替えたりKVM切り替えとかしたくないので ssh して作業します。
しますよね?
ssh は tty ではないので(ptsですね)フレームバッファを使う PyGame はそのままでは動きません。
別のケースとしては自動起動するアプリも考えられます。
Raspberry Pi 上で動かすということは組み込みで、自動起動してフレームバッファを使う的なニーズもあるはず。(というかそういう案件でした)
systemd を使ってサービスとして自動起動する場合も tty ではないのでそのままでは PyGame が使えません。
具体的には pygame.init()
のふたつめの返値(読み込み失敗したモジュール)が 1 になって pygame.display.Info()
が
pygame.error: video system not initialized
とか pygame.display.set_mode()
が
pygame.error: Unable to open a console terminal
になっちゃいます。
とは言えSDL
fbi は /dev/fb0 を指定して出力してるのでなんとかなる気がして。
(omxplayer は直接 HDMI を指定して出力するのでフレームバッファではなさそう)
そこで pygame.init()
周りのソースを追えばなんとかする方法あるんじゃないかと思って調べはじめたら
知りたいことビンゴな記事を書いてくれてる方がいました
環境編集 SDL_FBDEV にフレームバッファのパス /dev/fb0 を明示して root 権限で動かせばよいもよう。
というわけで、記事のように
os.putenv('SDL_FBDEV', '/dev/fb0')
とか
os.environ['SDL_FBDEV'] = '/dev/fb0'
でもいいし、起動前に
export SDL_FBDEV=/dev/fb0
でもよいはず。
ssh越しなら sudo でスプリプト実行、
systemd なら root権限で動くように設定すれば(supervisorなら user=root)
ちゃんと pygame.init()
も成功してPyGameが使えるようになります。
(∩´∀`)∩ワーイ
参考:SDL_envvars
この記事を書いた人
tama