launchd выполняет скрипт Python, но импорт не удается
Я написал скрипт на python, используя appscript для отслеживания моего текущего активного окна. Я запускаю его через launchd, но когда я делаю это, он не может импортировать appscript. Я установил PYTHONPATH в списке для launchd, но я думаю, что launchd не читает файлы.pth в пакетах сайта. Есть ли способ заставить это сделать это?
Мой скрипт здесь: https://github.com/katylava/macwintracker
Это стартовый лист:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>label</key>
<string>com.katylavallee.wintracker</string>
<key>ProgramArguments</key>
<array>
<string>/Users/kyl/Library/Application Support/com.katylavallee.wintracker/wintracker.py</string>
<string>1</string>
<string>1</string>
</array>
<key>Environment Variables</key>
<dict>
<key>PYTHONPATH</key>
<string>/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages</string>
</dict>
<key>StandardErrorPath</key>
<string>/Users/kyl/Library/Logs/com.katylavallee.wintracker/wintracker_err.log</string>
<key>StandardOutPath</key>
<string>/Users/kyl/Library/Logs/com.katylavallee.wintracker/wintracker.log</string>
<key>StartInterval</key>
<integer>3</integer>
</dict>
</plist>
И ошибка:
Traceback (most recent call last):
File "/Users/kyl/Library/Application Support/com.katylavallee.wintracker/wintracker.py", line 5, in <module>
from appscript import app, its
ImportError: No module named appscript
Скрипт python отлично работает из командной строки.
2 ответа
Скорее всего, что система Python (/usr/bin/python
) запускается для выполнения вашего скрипта, а не для MacPorts Python (/opt/local/bin/python2.6
) где у вас есть appscript
установлены. Что должно работать (не проверено!), Это вставить путь MacPorts Python в качестве первого Program Argument
до пути к скрипту. И в этом случае вам не нужно указывать PYTHONPATH
, Теоретически, вы можете сделать то, что у вас есть, до тех пор, пока MacPorts Python был настроен совместимым образом (т. Е. Схожие арки, цели развертывания и т. Д.) С системным Python, но, вероятно, вам не нужно или не нужно идти по этому пути.,
Другой подход заключается в том, чтобы изменить строку shebang (первую строку) сценария на путь экспликации к MacPorts Python:
#!/opt/local/bin/python2.6
Причина, по которой это работает в оболочке командной строки, заключается в том, что один из ваших файлов профиля оболочки, скажем, .bash_profile
, модифицирует PATH
переменная окружения для включения пути к MacPorts Python (/opt/local/bin
) сначала чтоб /usr/bin/env python
находит MacPython python
первый. Когда пробежишь launchd
оболочка не задействована так что PATH
манипуляция не происходит; только пути по умолчанию ищутся, что означает /usr/bin/env python
исполняет /usr/bin/python
,
Вы также можете использовать полный путь к Python в ProgramArguments. (Подробнее здесь: Запуск Python Script с Launchd: импорт не найден)
<key>ProgramArguments</key>
<string>/path/to/your/python</string>
<string>/path/to/your/script</string>