[英]Python script launched from launchd gives ImportError: No module named foo
当 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/scottmeup</string>
<key>PATH</key>
<string>/Users/scottmeup/.local/bin:/opt/local/bin:/opt/local/sbin:/Users/scottmeup/.nvm/versions/node/v15.8.0/bin:/Users/scottmeup/opt/anaconda3/bin:/Users/scottmeup/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/scottmeup/.local/bin:/opt/local/bin:/opt/local/sbin:/Users/scottmeup/.nvm/versions/node/v15.8.0/bin:/Users/scottmeup/opt/anaconda3/bin:/Users/scottmeup/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.scottmeup.iftttbot</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", line 1, in <module>
from selenium import webdriver
ImportError: No module named selenium
$ python iftttbot.py
Invalid input, usage requires: Username Password AppletID
$ echo $PATH
/Users/scottmeup/.local/bin:/opt/local/bin:/opt/local/sbin:/Users/scottmeup/.nvm/versions/node/v15.8.0/bin:/Users/scottmeup/opt/anaconda3/bin:/Users/scottmeup/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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.