使用cron运行Python脚本

2 投票
4 回答
6080 浏览
提问于 2025-04-16 09:19

嘿,大家好,我想用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 个回答

1

你可能在电脑上安装了两个版本的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

5

我想补充一点关于@Hank的回答。

cron这个工具并不会像你在命令行中那样设置所有的环境变量。它只会定义几个,比如 LOGNAME(登录名)、HOME(主目录)和 SHELL(使用的shell)。想了解更多信息,可以查阅“man 5 crontab”。

你可以像设置 MAILTO 一样,在cron中定义 PYTHONPATH 这个环境变量。所以不需要额外的shell包装器。

2

这主要是因为在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任务中指定一个解释器。请参考上面的内容 :)

撰写回答