带有具有以下plist的LaunchDaemon:
<?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.test.testing</string>
<key>ProgramArguments</key>
<array>
<string>python3</string>
<string>/Users/my-name/python-daemon/python_daemon_test.py</string>
</array>
<key>StandardErrorPath</key>
<string>/var/log/test-Error.log</string>
<key>StandardOutPath</key>
<string>/var/log/test.log</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
要启动的脚本在哪里
#!/usr/bin/env python3
import sys
print(sys.version)
print(sys.path)
我有我不了解的行为。
[当我在终端中运行脚本时(which python3
产生/Users/my-name/opt/anaconda3/bin/python3
),我收到以下输出:
3.7.4 (default, Aug 13 2019, 15:17:50)
[Clang 4.0.1 (tags/RELEASE_401/final)]
['/Users/my-name/python-daemon', '/Users/my-name/opt/anaconda3/lib/python37.zip',
'/Users/my-name/opt/anaconda3/lib/python3.7',
'/Users/my-name/opt/anaconda3/lib/python3.7/lib-dynload',
'/Users/my-name/.local/lib/python3.7/site-packages',
'/Users/my-name/opt/anaconda3/lib/python3.7/site-packages',
'/Users/my-name/opt/anaconda3/lib/python3.7/site-packages/aeosa']
这是所需要的,因为我希望运行的实际(非玩具)脚本使用了我在Anaconda中安装的PyObjc软件包。
但是,当脚本由LaunchDaemon运行时,我在test.log
文件中得到以下内容:
3.7.3 (default, Mar 6 2020, 22:34:30)
[Clang 11.0.3 (clang-1103.0.32.29)]
['/Users/my-name/python-daemon',
'/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python37.zip',
'/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7',
'/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/lib-dynload',
'/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/site-packages']
这是一个问题,因为我希望运行的实际脚本取决于Anaconda中的软件包。我曾预计,由于脚本中的第一个程序参数为python3
,因此它将以与终端中相同的python3
运行,但是我错了。
为什么脚本具有这种方式?我以为可能是因为它以sudo
的身份运行脚本,但是sudo which python3
也会将路径返回到Anaconda。
我该如何解决?我相信一个简单的解决方案是将想要安装的软件包安装在Python 3的Xcode版本中。但是,我实际上不确定如何做到这一点。这也让我感到有些不满意,因为我想知道为什么LaunchDaemons会这样表现。
启动守护程序(以及cron作业和...)不在常规的Terminal / shell环境下运行,因此它们不会在Terminal / shell环境中设置任何自定义内容,附加组件等。特别是,它们不会运行通常具有用于设置环境的命令的各种Shell初始化脚本(〜/ .bash_profile,〜/ .bashrc等)。
在特定的anaconda情况下,其安装程序会在〜/ .bashrc文件中添加一个部分,以将anaconda二进制文件目录添加至PATH
,并可能进行了许多其他更改。这会影响您在终端中的bash会话的环境,但不会对启动代理甚至其他shell(zsh is now the default, and it's causing some trouble with this)中的终端会话生效。