问题描述
当 python 脚本 iftttbot.py 与 launchd 一起使用 iftttbot.plist(都包括在下面)时,它给出了错误:
Traceback (most recent call last):
File "/usr/bin/iftttbot.py",line 1,in <module>
from selenium import webdriver
ImportError: No module named selenium
终端也会给出该错误,但前提是我明确使用了 python 二进制文件的完整路径。调用 python 二进制文件时省略完整路径会导致脚本按预期运行。
iftttbot.plist 将 PATH 变量设置为与我的 bash PATH 变量相同。将 PYTHONPATH 变量设置为等于 this 也不会影响行为。
从launchd运行python脚本以便找到模块的正确方法是什么?
iftttbot.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>disabled</key>
<false/>
<key>Environmentvariables</key>
<dict>
<key>HOME</key>
<string>/users/sc@R_404_6452@meup</string>
<key>PATH</key>
<string>/Users/sc@R_404_6452@meup/.local/bin:/opt/local/bin:/opt/local/sbin:/Users/sc@R_404_6452@meup/.nvm/versions/node/v15.8.0/bin:/Users/sc@R_404_6452@meup/opt/anaconda3/bin:/Users/sc@R_404_6452@meup/opt/anaconda3/condabin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string>
<!--
<key>PYTHONPATH</key>
<string>/Users/sc@R_404_6452@meup/.local/bin:/opt/local/bin:/opt/local/sbin:/Users/sc@R_404_6452@meup/.nvm/versions/node/v15.8.0/bin:/Users/sc@R_404_6452@meup/opt/anaconda3/bin:/Users/sc@R_404_6452@meup/opt/anaconda3/condabin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string>
-->
</dict>
<key>Label</key>
<string>com.sc@R_404[email protected]</string>
<key>ProgramArguments</key>
<array>
<string>/opt/local/bin/bash</string>
<string>-c</string>
<string>exec python /usr/bin/iftttbot.py username password AppletID</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/tmp/ifttt_err.log</string>
<key>StandardOutPath</key>
<string>/tmp/ifttt.log</string>
<key>StartInterval</key>
<integer>60</integer>
</dict>
</plist>
iftttbot.py
#!/opt/local/bin/python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
import requests,threading,glob,sys
import bs4 as bs
from selenium.webdriver.common.action_chains import ActionChains
...
print("Invalid input,usage requires: Username Password AppletID")
...
删除 #!/opt/local/bin/python 并不能防止错误
一些终端测试表明当使用 python 二进制文件的完整路径时找不到模块,否则脚本按预期运行:
$ which python
/opt/local/bin/python
$ /opt/local/bin/python iftttbot.py
Traceback (most recent call last):
File "iftttbot.py",in <module>
from selenium import webdriver
ImportError: No module named selenium
$ python iftttbot.py
Invalid input,usage requires: Username Password AppletID
$ echo $PATH
/Users/sc@R_404_6452@meup/.local/bin:/opt/local/bin:/opt/local/sbin:/Users/sc@R_404_6452@meup/.nvm/versions/node/v15.8.0/bin:/Users/sc@R_404_6452@meup/opt/anaconda3/bin:/Users/sc@R_404_6452@meup/opt/anaconda3/condabin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
Python 3.7.10
macOS 10.13.6
解决方法
更改以下行解决了问题:
<string>exec python /usr/bin/iftttbot.py username password AppletID</string>
<string>exec python3 /usr/bin/iftttbot.py username password AppletID</string>