2

URL から JSON を取得して処理し、取得したデータに重大な変更があった場合に通知する Python 3 スクリプトがあります。私はnotify2PyGObjectの libnotify バインディング (gi.repository.Notify) を使ってみましたが、どちらの方法でも同様の結果が得られました。このスクリプトは、ターミナルから実行すると問題なく動作しますが、cron が実行しようとすると停止します。

import notify2
from gi.repository import Notify

def notify_pygobject(new_stuff):
    Notify.init('My App')
    notify_str = '\n'.join(new_stuff)
    print(notify_str)
    popup = Notify.Notification.new('Hey! Listen!', notify_str,
                                    'dialog-information')
    popup.show()

def notify_notify2(new_stuff):
    notify2.init('My App')
    notify_str = '\n'.join(new_stuff)
    print(notify_str)
    popup = notify2.Notification('Hey! Listen!', notify_str,
                                 'dialog-information')
    popup.show()

ここで、文字列のリストで呼び出すスクリプトを作成するとnotify_pygobject、cron はメール スプール経由でこのエラーを返します。

Traceback (most recent call last):
  File "/home/p0lar_bear/Documents/devel/notify-test/test1.py", line 3, in <module>
    main()
  File "/home/p0lar_bear/Documents/devel/notify-test/test1.py", line 4, in main
    testlib.notify(notify_projects)
  File "/home/p0lar_bear/Documents/devel/notify-test/testlib.py", line 8, in notify
    popup.show()
  File "/usr/lib/python3/dist-packages/gi/types.py", line 113, in function
    return info.invoke(*args, **kwargs)
gi._glib.GError: Error spawning command line `dbus-launch --autolaunch=776643a88e264621544719c3519b8310 --binary-syntax --close-stderr': Child process exited with code 1

notify_notify2()...そして、代わりに呼び出すように変更すると:

Traceback (most recent call last):
  File "/home/p0lar_bear/Documents/devel/notify-test/test2.py", line 3, in <module>
    main()
  File "/home/p0lar_bear/Documents/devel/notify-test/test2.py", line 4, in main
    testlib.notify(notify_projects)
  File "/home/p0lar_bear/Documents/devel/notify-test/testlib.py", line 13, in notify
    notify2.init('My App')
  File "/usr/lib/python3/dist-packages/notify2.py", line 93, in init
    bus = dbus.SessionBus(mainloop=mainloop)
  File "/usr/lib/python3/dist-packages/dbus/_dbus.py", line 211, in __new__
    mainloop=mainloop)
  File "/usr/lib/python3/dist-packages/dbus/_dbus.py", line 100, in __new__
    bus = BusConnection.__new__(subclass, bus_type, mainloop=mainloop)
  File "/usr/lib/python3/dist-packages/dbus/bus.py", line 122, in __new__
    bus = cls._new_for_bus(address_or_type, mainloop=mainloop)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

PATH=いくつかの調査を行ったところ、 を crontab に入れるか、エクスポートする提案がありました$DISPLAY(スクリプト内で を呼び出してos.system('export DISPLAY=:0')実行しました) が、どちらも変更には至りませんでした...

4

3 に答える 3

6

あなたは正しい軌道に乗っています。この動作は、cron がマルチユーザーのヘッドレス環境で実行されているため (GUI のない端末で root として実行されていると考えてください)、そのため、彼はどのディスプレイ (X Window Server セッション) とユーザーのターゲットを認識していないためです。アプリケーションが開いている場合 (たとえば、ウィンドウや一部のユーザー デスクトップへの通知)、この問題が発生します。

cron を編集するcrontab -eと、エントリは次のようになります。

m h dom mon dow command

何かのようなもの:

0 5 * * 1 /usr/bin/python /home/foo/myscript.py

PATH環境変数が異なる可能性があるこの種の状況では、Pythonへのフルパスを使用する方が良いことに注意してください。

次に、次のように変更します。

0 5 * * 1 export DISPLAY=:0 && /usr/bin/python /home/foo/myscript.py

それでもうまくいかない場合は、ユーザーが X Windows サーバーを制御できるようにする必要があります。

あなたに追加.bash_rc

xhost +si:localuser:$(whoami)

于 2013-06-24T18:04:33.570 に答える