先日よりマウスやキーボード操作を自動化してきました。
その時に用いているのがPyAutoGUIなのですが、、
ラズパイに対して、ssh上でPyAutoGUIで作成したコードを実行したところ、
KeyError: 'DISPLAY'
というエラーが発生し、実行が行えませんでした。
今回は上記を解消し、
ssh上でPyAutoGUIを実行するための方法を備忘録としてまとめたいと思います。
■エラー発生原因
Linuxの環境変数に、
DISPLAY
があるのですが、
ssh接続したコンソールではこの環境変数が正しく設定出来ておらず、
エラーが出てしまっているようです。
試しにDesktop上、ssh接続したコンソール上のそれぞれで、
echo $DISPLAY
と実行してみたところ、
Desktop上の場合には、
:0.0
と返ってくるのを確認したのですが、ssh上では何も表示されませんでした。
■解決方法
環境変数DISPLAYに値が入っていないのが原因なので、
環境変数にDesktop上で設定されている環境変数と同様の値を入れてあげればOK。
コマンドはこちら。
export DISPLAY=:0.0
上記を実行した後にPyAutoGUIを実行すればエラーなく実行させることが出来ました。
■Robotgoはどうか?
PyAutoGUIでエラーになったがgo言語のRobotgoはどうなるのか合わせて確認しました。
当然と言えば当然ですが、
環境変数DISPLAYに値が入っていない場合にはエラーとなってしまいましたが、
環境変数DISPLAYに値を入れれば、実行することが出来ました。
ただしRobotgoでは発生するエラーメッセージが異なり、
こちらのようなメッセージが表示されました。
on_library_load [436]: XOpenDisplay failure! load_input_helper [1883]: XkbGetKeyboard failed to locate a valid keyboard! signal: segmentation fault
■環境変数DISPLAYとは何か?
LinuxでGUIを提供するシステムとして、
X Window System
が用いられます。
X window Systemについてはこちらに詳しく載っておりますので参考にしてください。
www.mtioutput.com
上記記事にも記載されてます通り、
X window Systemはクライアント/ サーバーシステムであり、
サーバーからクライアントへ指示を行う際にどのウィンドウに指示を出すのかを知る必要があります。
この指示を出す先を決めているのが、
環境変数DISPLAY
であり、こちらが正しく設定されていなければサーバーはどのディスプレイを使用するのか分からないのでエラーになってしまう。
というわけです。
■補足
環境変数DISPLAYですが、
export DISPLAY=host名:0.0
といったようにホスト名を指定することも出来ます。
このため、
export DISPLAY=localhost:0.0
といったようなホスト名を指定して使用するディスプレイを切り替えることも出来ます。
と言っても自分の環境だと、
Xlib.error.DisplayConnectionError: Can't connect to display "localhost:0": [Errno 111] Connection refused
という別のエラーが出てしまっているのですが。。
とりあえず、
export DISPLAY=:0.0
でやりたいことは出来ているので、運用はこちらで実施していきたいと思います。
エラー原因の解析は時間を見て実施していきます。
■最後に
今回はssh経由でPyAutoGUI(とRobotgo)のコードを実行するための環境設定についてまとめました。
とりあえず、ホスト名指定した時に発生したエラーの原因はゆっくり調べてみたいと思います。