Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

PyAutoGUIをsshで実行するには

先日よりマウスやキーボード操作を自動化してきました。
その時に用いているのがPyAutoGUIなのですが、、
ラズパイに対して、ssh上でPyAutoGUIで作成したコードを実行したところ、

KeyError: 'DISPLAY'

というエラーが発生し、実行が行えませんでした。

今回は上記を解消し、
ssh上でPyAutoGUIを実行するための方法を備忘録としてまとめたいと思います。



■環境

先ほど記載した通り、
ラズパイに対してwindowsからssh接続してPyAutoGUIのコードを実行したケースになります。

■エラー発生原因

Linux環境変数に、
DISPLAY
があるのですが、
ssh接続したコンソールではこの環境変数が正しく設定出来ておらず、
エラーが出てしまっているようです。

試しにDesktop上、ssh接続したコンソール上のそれぞれで、

echo $DISPLAY

と実行してみたところ、
Desktop上の場合には、

:0.0

と返ってくるのを確認したのですが、ssh上では何も表示されませんでした。

確かにsshでは環境変数DISPLAYに正しい値が入っていないので、
エラーになってしまうのは当然ですね。

■解決方法

環境変数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とは何か?

LinuxGUIを提供するシステムとして、
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)のコードを実行するための環境設定についてまとめました。
とりあえず、ホスト名指定した時に発生したエラーの原因はゆっくり調べてみたいと思います。