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
答案 0 :(得分:5)
我想在@Hank的回答中添加一点。
cron没有像您使用的shell中那样设置所有环境变量。仅定义了LOGNAME
,HOME
和SHELL
。 (有关详细信息,请参阅“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
。