使用cron运行Python脚本
嘿,大家好,我想用cron每5分钟运行一次一个Python脚本,里面有一个Django的导入。
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 1.2,Python 2.6,还有MacOS 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 个回答
你可能在电脑上安装了两个版本的Python,而/usr/bin/python
这个路径指向的不是你安装Django的那个版本。
试着让sender.py
这个文件可以执行,方法是在文件的第一行加上以下内容:
#!/usr/bin/env python
然后用命令chmod a+x
来修改它的权限。接着试着用./sender.py
来运行它。
如果能成功运行,就把crontab中的/usr/bin/python /Users/paulo/Desktop/ashtanga/ping/sender.py
替换成/Users/paulo/Desktop/ashtanga/ping/sender.py
。
我想补充一点关于@Hank的回答。
cron这个工具并不会像你在命令行中那样设置所有的环境变量。它只会定义几个,比如 LOGNAME
(登录名)、HOME
(主目录)和 SHELL
(使用的shell)。想了解更多信息,可以查阅“man 5 crontab”。
你可以像设置 MAILTO
一样,在cron中定义 PYTHONPATH
这个环境变量。所以不需要额外的shell包装器。
这主要是因为在cron执行脚本时使用的Python解释器。下面是如何确定这个解释器的方法:
打开文件 /Users/paulo/Desktop/ashtanga/ping/sender.py,看看文件顶部是否有一行以 '#!' 开头。这一行指明了当你在命令行运行这个脚本时,使用的是哪个版本的Python,前提是你没有指定具体的解释器。所以,如果这一行是 "#!/usr/bin/python",然后你在命令行这样运行它:
$ /Users/paulo/Desktop/ashtanga/ping/sender.py
(这里的 '$' 是命令行提示符)
那么就是在调用 /usr/bin/python 这个解释器。如果你这样运行脚本时它能正常工作,那么你就要确保cron在执行你的任务时也是调用这个 /usr/bin/python 解释器。
不过,除了在 '#!' 行中明确指定的Python解释器(在某些地方称为'shebang'行)之外,还有另外两种可能性:
首先,shebang行可能是 '#!/usr/bin/env python',这意味着“使用在用户的 $PATH 环境变量中找到的第一个Python解释器”。你不想在cron中依赖这个,所以你需要明确指定一个Python解释器的路径。你已经在这么做了,但你需要确保如果在命令行中启动 /usr/bin/python,它能成功导入django。如果不能,你需要找出哪个可以,并在你的cron任务中指定那个。
第二种情况是脚本中根本没有shebang行,这种情况下你也必须在你的cron任务中指定一个解释器。请参考上面的内容 :)