使用Launchd运行Python脚本:无法找到导入项

4 投票
2 回答
3977 浏览
提问于 2025-04-17 19:49

我一直在尝试设置一个脚本,让它定期运行一个Python程序,使用的是launchd。但是我的Python程序出错了,因为它找不到我需要的库——我通过查看日志文件发现了这个问题。为了解决这个问题,我创建了~\.MacOSX\environment.plist,并在里面复制了我的PYTHONPATH,然后注销再登录。可惜这样做似乎还是不够,问题没有解决,我不知道该怎么做了。

我使用的是OSX,版本10.8.3。

相关讨论:

更新:

看来我可以运行以下命令:

launchctl setenv PYTHONPATH $PYTHONPATH

这样脚本就能成功执行。那么,我想修改一下我的问题:

  1. 这个设置存储在哪里?我检查了~\.launchd.conf\etc\.launchd.conf,但都不存在。
  2. 我想这个设置在重启时会丢失。我可以在哪里更改这个信息,以便launchd能找到它?

2 个回答

2

以上提到的方法对我来说都没用(我用的是 OS X 10.11.3)。后来我看到这篇文章 脚本在终端运行正常,但在 launchd 中不行,才意识到其实可以写出 Python 的完整路径,这样就能找到正确的模块了。真是个大失误。

<?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.example.app</string>
    <key>ProgramArguments</key>
    <string>/path/to/your/python</string>
    <string>/path/to/your/script</string>
</dict>
</plist>
7

要为特定的工作设置环境,你应该在工作定义中使用 EnvironmentVariables 这个关键字:

<?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.example.app</string>
    <key>Program</key>
    <string>/path/to/your/script</string>
    <key>EnvironmentVariables</key>
    <dict>
        <key>PYTHONPATH</key>
        <string>/your/python/path</string>
    </dict>
</dict>
</plist>

你可以通过编辑 /etc/launchd.conf 来为 launchd(8) 服务定义默认的环境变量,这个文件是给后台进程用的;而 /etc/launchd-user.conf 则是给用户代理用的。后者虽然可以用,但没有文档说明。现在有文档说明的(不过不被支持的)每个用户的配置文件是 $HOME/.launchd.conf

这些配置文件里包含了一系列 launchctl(1) 的子命令。你需要的命令是:

setenv PYTHONPATH /your/python/path

更新: 在 Mac OS X 10.10 及更高版本中,/etc/launchd.conf 不再被支持。在这些系统上,你需要为每个工作单独定义环境变量。

撰写回答