[Python] 在RHEL7的crontab執行python檔案會出現ImportError: No module named {some module}?

  • 703
  • 0

寫了一支xxx.sh檔放在crontab裡面跑,但是怎麼都沒做到該做的事呢?試著使用sudo /{file path}/xxx.sh之後出現ImportError: No module named {some module},但是把sudo去掉卻可以正常執行,什麼鬼??

由於手上的python程式需要弄到RHEL排程裡面定時執行,將分析結果存到資料表裡面,所以寫了一支.sh檔案,裡面很簡單的判斷一下同一支python程是否還在執行,是的話就直接結束掉,等下一次排程啟動:

#!/bin/bash
if ps -ef | grep -v grep | grep AnalyseJob_36.py ; then
        exit 0
else
        python36 /{file path}/AnalyseJob_36.py "Analyse Job is not running...  Startting now." 
        exit 0
fi

然後再放進crontab,訂一下時間:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be execute

#auto analyse new Lots
*/1 * * * * root /{file path}/AnalyseJob_36.sh

弄好之後刷新資料表卻沒看到應該出現的分析結果,怎麼會?如果直接執行.sh檔的話的確有新資料阿!

好,試著用sudo跑一下.sh檔,卻出現了ImportError: No module named {some module},這什麼鬼東西,我明明已經裝了這個module啊?難道加了sudo會用另一個版本的python來跑嗎?查了一下StackOverflow,有大神們提到跟/etc/sudoers有關,所以是執行環境的設定造成。因此先確定一下python36的路徑是在哪邊:

[root@xxxdev03 ~]# which python36
/usr/bin/python36

然後將.sh檔案改寫一下,指定完整路徑給python36:

#!/bin/bash
if ps -ef | grep -v grep | grep AnalyseJob_36.py ; then
        exit 0
else
        /usr/bin/python36 /{file path}/AnalyseJob_36.py "Analyse Job is not running...  Startting now." 
        exit 0
fi

然後再刷新一下資料表的確就看到分析結果了。不過大神們有多種解決方式,例如修改/etc/sudoers的設定、在crontab裡面直接指定PYTHONPATH、在.sh檔裡面指定PYTHONPATH,或在.py檔表頭增加#!/usr/bin/python36,應該都可以解決這個問題,在這邊留一下紀錄備忘。