如何在cron任务中运行Python文件

0 投票
2 回答
617 浏览
提问于 2025-04-18 18:06

我需要运行这个文件:

from apps.base.models import Event
from apps.base.models import ProfileActiveUntil
from django.template import Context
from django.db.models import Q
import datetime
from django.core.mail import EmailMultiAlternatives
from bonzer.settings import SITE_HOST
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from bonzer.settings import send_mail, BONZER_MAIL, BONZER_MAIL_SMTP, BONZER_MAIL_USER,         BONZER_MAIL_PASS, BONZER_MAIL_USETLS


today = datetime.date.today()
monthAgo = today + datetime.timedelta(days=1)
monthAgoMinusOneDay = today + datetime.timedelta(days=2)
events = Event.objects.all()
ProfileActiveUntils = ProfileActiveUntil.objects.filter(Q(active_until__range=(monthAgo, monthAgoMinusOneDay)))
msg = MIMEMultipart('alternative')
msg['Subject'] = "Novim dogodivscinam naproti"
msg['From'] = BONZER_MAIL
msg['To'] = 'jjag3r@gmail.com'

text = u'bla'
html = u'bla'
send_mail(msg_to=msg['To'], msg_subject=msg['Subject'], msg_html=html, msg_text=text)

我这样执行它:*/2 * * * * /usr/local/bin/python2.7 /home/nezap/webapps/bonzer/bonzer/apps/base/alert.py

但是我遇到了错误:没有名为 apps.base.models 的模块。

一个重要的事实是,我无法在服务器上安装 virtualenv,因为我没有权限。而且我对这些东西还是个新手,所以在服务器或 Python 方面的技能也不多。

谢谢。

2 个回答

2

cron 是一个定时任务工具,它不会读取 rc shell 文件。所以你需要手动设置一个环境变量叫做 PYTHONPATH,这个变量要包含 apps 包的位置,以及脚本运行所需的其他模块文件的位置。

PYTHONPATH=/usr/local/lib/python2.7:/usr/lib/python2.7
*/2 * * * * /usr/local/bin/python2.7 /home/nezap/webapps/bonzer/bonzer/apps/base/alert.pyr
0

我猜这个问题可能跟你的当前工作目录有关。一个简单的方法来测试这个问题,就是先进入根目录(输入命令 cd /),然后运行:

python2.7 /home/nezap/webapps/bonzer/bonzer/apps/base/alert.py

你应该会看到同样的错误。你需要使用的路径取决于你通常从哪个地方运行这个脚本。我猜可能是:

/home/nezap/webapps/bonzer/bonzer/apps/base

或者

/home/nezap/webapps/bonzer/bonzer/

所以你的解决方案可能是:

*/2 * * * * cd /home/nezap/webapps/bonzer/bonzer/apps/base && /usr/local/bin/python2.7 ./alert.py

或者

*/2 * * * * cd /home/nezap/webapps/bonzer/bonzer && /usr/local/bin/python2.7 ./apps/base/alert.py

基本上,你是在告诉 cron(定时任务)切换到那个路径,如果切换成功(用 && 表示),就运行接下来的命令。

撰写回答