crontab 执行 python定时代码无法导入模块

前言:

crontab 是最常用的 linux 定时任务命令,当 linux 里面 python 环境有多种的时候有可能出现无法导入模块的状况,即出现 “ImportError” 错误,而且最怪异的是直接手动执行 python 代码无任何异常,总的来说 crontab 比较呆,我们仔细研究一下,方便我们顺利执行定时任务。

1.crontab 执行 python 的呆

看一个普通的 crontab 命令:

10 0 * * * cd /home/map_poi/main/; python -u on_time_start.py value.conf > on_time_start.log 2>&1 &

意思:每天凌晨0点10分,跳转到 /home/map_poi/main/ 目录下执行on_time_start.py 脚本,并把打印的日志不通过缓存(-u)直接输入到on_time_start.log 文件里面

我的 on_time_start.py 脚本有 import requests 模块引入,早上来看on_time_start.log文件就发现只有一段说明,意思就是模块 requests 找不到,白天直接执行明明是可以的,郁闷

研究了一下 crontab ,它使用的 python 命令可以理解是 linux 系统自带的python,如果你后来重新装了 python ,它根本就不会引用,那么和新装 python 关联的模块也就找不到,所以就需要指定 python 的绝对路径

2.查找 python 路径

用命令找一下 /usr/bin 下都有那些 python

ls /usr/bin | grep python

结果:

python
python2
python2.7

检验一下 python 里面是否有第三方模块:

/usr/bin/python -c "import requests"

然后发现:

  File "", line 1, in 
ImportError: No module named requests

没有 requests 模块,然后看一下 python2 和 2.7,也没有,我都震惊了,那用python跑脚本为啥可以跑通,那个可以跑的 python 是哪里的

逼我啊,算了,用一个非常简单的命令看一下那么默认的 python 命令来源哪里:

which python

结果:

/root/anaconda2/bin/python

好吧,这是别人装的机器,我也不晓得这里还有一个 python ,检验一下是否有第三方模块

/root/anaconda2/bin/python -c "import requests"

没有任何提示,也就是说这个 python 里面是有第三方模块“requests”的,于是crontab 命令改一下,把python替换成上面那个绝对地址

10 0 * * * cd /home/map_poi/main/; /root/anaconda2/bin/python -u on_time_start.py value.conf > on_time_start.log 2>&1 &

事实证明,这是对的

你可能感兴趣的:(Linux)