脚本在终端运行正常,但不是从launchd运行

时间:2015-02-16 00:12:43

标签: python shell terminal environment launchd

我的Python脚本在终端中运行良好但是当我尝试将它设置为每天运行一次并使用launchd(使用名为Lingon的软件设置)时,我只是无法运行它。从我读过的所有内容中,最好从shell脚本调用Python脚本(我在Macbook上运行Yosemite)。所以,这就是我想要做的事情。我希望运行脚本时得到的错误是:

未设置TERM环境变量。

env:python3:没有这样的文件或目录

此时,我非常确定这是一个环境问题,但无论我尝试什么,我都无法让它运行。顺便说一句,我可以通过这种方式让shell脚本按计划运行:

#!/bin/bash
echo "hello world."

当我尝试运行时出现问题:

#!/bin/bash
/Users/jeff/Documents/scripts/my_script.py

另外,即使我长时间使用电脑,我仍然对很多事情一无所知,所以请告诉我如何解决这个问题,就像我新手一样

2 个答案:

答案 0 :(得分:1)

根据文章here,您需要为launchd创建一个.plist,如下所示:

<?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>
    <!-- The label should be the same as the filename without the extension -->
    <string>org.yourusername.my_script-test</string>
    <!-- Specify how to run your program here -->
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/python3</string>
        <string>/Users/jeff/Documents/scripts/my_script.py</string>
    </array>
    <!-- Run every hour -->
    <key>StartInterval</key>
    <integer>3600</integer><!-- seconds -->
</dict>
</plist>

然后:

$ launchctl load ~/Library/org.yourusername.my_script-test.plist
$ launchctl start org.yourusername.my_script-test

此处的文章涵盖environment variables

答案 1 :(得分:0)

我已经尝试了所有提到的内容,特别感谢Padraic,但似乎没有任何效果。这很奇怪,因为从终端运行时脚本运行完美,但从launchd运行时出现错误。从launchd运行时我能够摆脱错误,但脚本不会从终端运行。很奇怪。但是,我是如何让它在终端和从launchd按计划运行的。首先,我改变了shebang线:

#!/usr/bin/env python3

到此:

#!/usr/bin/env /Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4

然后,我必须在脚本的其余部分指定文件的完整路径,例如,从中:

log = open('log_directory/my_log.log', 'a')

到此:

log = open('/Users/jeff/documents/my_script_documents/python/development/log_directory/my_log.log', 'a')

无论如何,这一切现在都有效,但我相信我遇到的问题可能与将Mac升级到优胜美地操作系统有关。有关于Yosemite中有关launchd / launchd.conf / launchctl的可能错误的提及。嗯,我想相信在过去的4天里不是我试图让这个工作......但谁知道呢?