使用Launchd运行Python脚本:无法找到导入项
我一直在尝试设置一个脚本,让它定期运行一个Python程序,使用的是launchd
。但是我的Python程序出错了,因为它找不到我需要的库——我通过查看日志文件发现了这个问题。为了解决这个问题,我创建了~\.MacOSX\environment.plist
,并在里面复制了我的PYTHONPATH
,然后注销再登录。可惜这样做似乎还是不够,问题没有解决,我不知道该怎么做了。
我使用的是OSX,版本10.8.3。
相关讨论:
- launchd执行Python脚本,但导入失败(不适用——我的脚本指向了正确的Python实例)
更新:
看来我可以运行以下命令:
launchctl setenv PYTHONPATH $PYTHONPATH
这样脚本就能成功执行。那么,我想修改一下我的问题:
- 这个设置存储在哪里?我检查了
~\.launchd.conf
和\etc\.launchd.conf
,但都不存在。 - 我想这个设置在重启时会丢失。我可以在哪里更改这个信息,以便
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
不再被支持。在这些系统上,你需要为每个工作单独定义环境变量。