Скрипт Python работает в терминале, но не с launchd

Im пытается запустить скрипт python с помощью launchd на OS X. Когда я запускаю его из терминала с помощью следующих команд, он работает:

$ /Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4 /Users/me/path/to/script.py

Вот мой файл launchd plist, который имеет те же команды под ключом ProgramArguments, но он не работает.

<?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>net.me.my-script</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4</string>
        <string>/Users/me/path/to/script.py</string>
    </array>
    <key>StartInterval</key>
    <integer>86400</integer>
</dict>
</plist>

Launchd изначально не работал, поэтому я попытался запустить его в терминале вручную, и я получил ошибку и понял, что мне нужно ссылаться на файлы, которые я читал и писал в скрипте python с их полным путем, поэтому я исправил это. Это заставило скрипт работать в терминале, но он не исправил проблему в launchd (да, я выгружал и загружал его несколько раз).

Я побежал launchctl listи нашел 1код выхода, указанный рядом с моим plist, затем я проверил /var/log/system.войти и нашел сообщение об ошибкеService exited with abnormal code: 1, но это все сообщения об ошибках, которые я могу найти.

Основываясь на «последних измененных» датах и материале из finder, кажется, что он открывает xml-файл в скрипте python, но он ничего не пишет в него. Он также не кажется, чтобы открыть файл json в скрипте.

Опять же, все это прекрасно работает вручную в терминале, поэтому я думаю, что это должна быть проблема plist или launchd.

1 ответ

  1. Разрешенный. Я смог установить ключи StandardErrorPath и StandardOutPath и увидеть ошибки, которые бросал скрипт. Я получал несколько UnicodeEncodeErrors на экземплярах f.write()и f.read()при манипулировании xml-файлом, но только при запуске сценария через launchd. Я заменил with open('file.xml', 'w') as f:with io.open('file.xml', 'w', encoding='utf8') as f:и то же самое для чтения экземпляров, и это работает! Кто-нибудь знает, почему это хорошо работало в моей IDE и в терминале, но не в launchd?? Все используют один и тот же интерпретатор.