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