用cron运行python脚本

时间:2011-01-03 02:48:38

标签: python django linux cron crontab

嘿伙计们,即时尝试使用cron每隔5分钟运行一个python脚本,脚本内部是django import

import django

运行crontab时,我收到了以下错误

ImportError: No module named django

这是crontab文件的样子:

MAILTO=commonzenpython@gmail.com

*/5 * * * *  /usr/bin/python /Users/paulo/Desktop/ashtanga/ping/sender.py

你们中的任何人都知道造成这种情况的原因吗? 顺便说一句,我确实有django insalled版本1.2,python 2.6和MacOX 10.6

编辑:

$ PYTHONPATH =与python

不一样

python -v =

Python 2.6.6 (r266:84374, Aug 31 2010, 11:00:51) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin

哪个python

/Library/Frameworks/Python.framework/Versions/2.6/bin/python

4 个答案:

答案 0 :(得分:5)

我想在@Hank的回答中添加一点。

cron没有像您使用的shell中那样设置所有环境变量。仅定义了LOGNAMEHOMESHELL。 (有关详细信息,请参阅“man 5 crontab”。)

您可以像定义PYTHONPATH一样在cron中定义MAILTO环境变量。所以不需要shell包装器。

答案 1 :(得分:2)

这归结为当cron执行脚本时使用的实际python解释器,所以这里是如何缩小它:

打开/Users/paulo/Desktop/ashtanga/ping/sender.py并查看顶部是否有一行以'#!'开头。这是在命令行上运行脚本时调用的Python版本,如果您没有使用显式解释器调用它。所以,如果该行显示“#!/ usr / bin / python”,并在命令行运行它,如下所示:

$  /Users/paulo/Desktop/ashtanga/ping/sender.py

(其中'$'是命令行提示符)

然后/ usr / bin / python是被调用的解释器二进制文件。如果脚本以这种方式运行,那么你需要确保/ usr / bin / python是cron在运行你的工作时调用的解释器。

但是,除了'#!'中显示的显式Python解释器之外线(在某些圆圈中称为“shebang”线),还存在两种可能性:

首先,shebang行可能会说'#!/ usr / bin / env python',这意味着'使用Python解释器是第一个在用户的$ PATH环境变量中搜索目录时找到的解释器'。当您从cron运行时,您不希望依赖它,因此您希望指定Python解释器的显式路径。您已经这样做了,但是您需要确保如果在命令行启动/ usr / bin / python,它可以成功导入django。如果它不能,你需要找到哪一个,并在你的cron作业中指定一个。

其次,脚本中根本没有shebang行,在这种情况下,你必须在你的cron作业中指定一个解释器。见上文:)

答案 2 :(得分:1)

听起来您的CRON作业环境没有对site-packages目录的正确引用。您可以尝试在PYTHONPATH周围的shell包装器中设置sender.py环境变量,或者可能从sys.path内部调整sender.py。真的,如果你有一个涉及Django的重复任务,你应该考虑celery

答案 3 :(得分:1)

您可能安装了两个版本的python,/usr/bin/python不是安装Django的版本。

尝试通过将以下行插入文件的第一行

来使sender.py可执行
#!/usr/bin/env python

并将其修改为+ x。然后尝试使用./sender.py运行它。

如果有效,请将crontab中的/usr/bin/python /Users/paulo/Desktop/ashtanga/ping/sender.py替换为/Users/paulo/Desktop/ashtanga/ping/sender.py