Pythonで書かれたスクリプトがあります。
#!/usr/bin/python3
from tkinter import messagebox
variable = messagebox.showinfo('title', 'question')
このPythonスクリプトは、画面にメッセージボックスを表示する以外は何もしません。 USBドライブをコンピュータに接続するときにこのスクリプトを起動したいと思います。
そのため、/etc/udev/rules.d/ディレクトリに10-myself.rulesという新しいファイルを作成しました。
KERNEL="sdb",RUN+="/usr/bin/python3 /home/user/projects/path_to_python.py"
ただし、USBドライブをコンピュータに接続すると、メッセージボックスは表示されません。エラーはどこにありますか?どのようにデバッグできますか?
私も命令を呼んだ
udevadm control --reload-rules
ルールを次に変更してみました。
KERNEL="sdb*",RUN+="/usr/bin/python3 /home/user/projects/path_to_python.py"
または規則に従って
KERNEL="sdb1",RUN+="/usr/bin/python3 /home/user/projects/path_to_python.py"
スクリプトを次に変更すると
file1 = open("/home/user/udev.txt", "w")
file1.write("Hello")
file1.close()
これでこのスクリプトが機能します。
答え1
コードがrootまたはudevユーザーとして実行されており、そのユーザーにはウィンドウマネージャとチャットしてTkウィンドウなどを作成する権限がないようです。ログエントリを作成するudevスクリプト、ウィンドウマネージャ環境のもう一方の端がメッセージを読み、適切なアクションを実行できるソケットにメッセージを送信するなど、一部の種類の通信が役立ちます。
答え2
対話型シェルでスクリプトを実行すると、DISPLAY
接続権限を持つサーバーを表す環境変数があります。
実行中はudev
そうではありません。
udev
一般的に言えば、X11の実行に依存する作業は望ましくなく、この方法で攻撃面を増やすことも望ましくありません。
あなたは購読/通知システムを探しているようです。そのため、Xセッションを使用して(自分のような)リスナーを起動し、そこで通知を実行させることができますudev
。これを行うには、DBusまたはUDiskを調べることもできます。あるいは、inotifywait
デバイスファイルの作成を監視し、そのイベントをスクリプトから読み取ることもできます(再度、すべてrootではないユーザーとして)。