Crontab执行Python脚本提示No module named Pandas问题求助
嘿,这个问题我见得挺多的——Cron的执行环境和你平时在终端里敲命令的shell环境根本不是一回事!从你收到的Cron邮件里能看到关键线索:它的PATH只有/usr/bin:/bin,而且默认调用的大概率是系统自带的Python,而你平时用的、已经装了Pandas的那个Python,要么不在这个PATH里,要么Cron压根没找到它。
下面给你几个一步步就能搞定的办法,按靠谱程度排序:
1. 直接用Python的绝对路径运行(最稳妥)
先搞清楚你平时跑脚本用的是哪个Python:在终端里敲
which python # 要是你用的是python3就敲 which python3
比如得到的路径是/usr/local/bin/python3,那把Cron里的命令改成这样:
PYTHONPATH=/Users/user/Library/Python/3.6/lib/python/site-packages /usr/local/bin/python3 ~/downloads/random/milbtrans.command
这样Cron就会乖乖用你指定的、已经装了Pandas的Python版本,不会再瞎用系统默认的那个没装包的了。
2. 把你的用户PATH导入Cron
要是不想每次都写长路径,那就把你平时用的PATH加到Cron里。先在终端里看自己的PATH:
echo $PATH
然后编辑Crontab的时候,先把PATH设好,比如:
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin PYTHONPATH=/Users/user/Library/Python/3.6/lib/python/site-packages # 这里替换成你的Cron时间规则 * * * * * python3 ~/downloads/random/milbtrans.command
这样Cron就能找到你平时用的Python和各种工具了。
3. 确认你的PYTHONPATH是不是真的对
你现在设置的PYTHONPATH=/Users/user/Library/Python/3.6/lib/python/site-packages,先检查这个路径里到底有没有Pandas:
ls /Users/user/Library/Python/3.6/lib/python/site-packages | grep pandas
要是没找到,说明你装Pandas的路径根本不是这个——可以用pip show pandas看它的安装位置,然后把PYTHONPATH改成正确的site-packages路径。
4. 用虚拟环境(长期项目强烈推荐)
如果你的脚本依赖一堆包,那用虚拟环境隔离是最好的办法。先创建并激活虚拟环境,把Pandas和其他依赖都装好,然后Cron里直接用虚拟环境里的Python路径就行。比如你的虚拟环境在~/venvs/mybaseballenv,那路径就是~/venvs/mybaseballenv/bin/python,Cron命令改成:
* * * * * ~/venvs/mybaseballenv/bin/python ~/downloads/random/milbtrans.command
这样就彻底解决环境不一致的问题了,以后加新包也不会乱。
内容的提问来源于stack exchange,提问作者Justin

