EDIT: Ich habe es auf ein Problem mit Notifier.notify('Something')
im Python-Code eingegrenzt. Das führt nicht zu dem erwarteten Verhalten, wenn das Python-Skript von Launchd aus gestartet wird. Meine anderen Python-Skripte funktionieren gut./EDITlaunchd: Python Notifier.notify produziert keine erwartete Ausgabe
OSX 10.11.4: Ich versuche, launchd zu verwenden, um ein Python 3.5-Skript auszuführen, wenn sich etwas im Verzeichnis ändert (z. B. fügt jemand eine Datei hinzu). Ich verwende die folgende plist-Datei (platziert in ~/Library/Launchagents und mit launchctl geladen), und es scheint, mit einem Shell-Skript
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.test.notifyme</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/notifyme.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/path/to/NotifyMeDir</string>
</array>
</dict>
</plist>
Dies ist der Shell-Skript wie erwartet zu funktionieren:
#!/bin/bash
# notifyme.sh
osascript -e "tell application \"System Events\" to display notification \"Something\""
jedoch, wenn ich die plist-Datei zu haben, ändern:
<key>ProgramArguments</key>
<array>
<string>/path/to/notifyme.py</string>
</array>
, die den fo ruft llowing Python Programm
#!/path/to/python3.5
# notifyme.py
from pync import Notifier
Notifier.notify('Something')
ich nicht mehr die erwartete Ausgabe, wenn ich eine Datei im Verzeichnis NotifyMeDir ändern.
/var/log/system.log gibt folgenden wird die beim Versuch, die .py Datei mit launchd zu starten:
... com.apple.xpc.launchd[1] (com.test.notifyme): Service only ran for 4 seconds. Pushing respawn out by 6 seconds.
so sieht es aus wie launchd bei der Erkennung funktioniert prima, dass das Verzeichnis geändert - es ist einfach das Python-Skript nicht ausführen.
Ich habe eine Problemumgehung, die das Aufrufen des Python-Programms aus dem Shell-Skript beinhaltet. Das funktioniert nur, wenn ich nach dem Aufruf des Python-Programms einen Shell-Befehl mit osascript ausführe. Ich habe entsprechend "cdmod u + x ..." sowohl im Shell-Skript als auch im Python-Skript aufgerufen, und beide funktionieren, wenn sie außerhalb von launchd aufgerufen werden. Es funktioniert auch gut, wenn Sie etwas anderes als "WatchPaths" verwenden (z. B. alle 15 Sekunden). Hier
ist die Abhilfe:
#!/bin/bash
/path/to/python /path/to/notifyme.py
osascript -e "tell application \"Finder\" to activate"
Wie Sie sehen können, ist dies nicht alles zu haben scheint zu tun Ich bin ratlos. Ich möchte das ausführen lassen, ohne ein Shell-Skript aufrufen zu müssen, um ein Python-Skript aufzurufen.