1

我在为我的 Django 应用程序设置 crontab 一周时遇到了问题,我几乎想通了。(与Unable to make a function call using Django-cron相关的问题)

我的 crontab -e 语法是

* * * * * /Users/ashwin/dashboard/proj_application/exec.sh >> /Users/ashwin/dashboard/proj_application/data.log 2>&1

在我的 exec.sh 中,我有

#!/bin/bash
cd "$(dirname "$0")";
CWD="$(pwd)"
echo $CWD
python -c 'import proj_application.cron as cron; cron.test()'

cron.py中,

from django.core.mail import send_mail
from smtplib import SMTP
from email.mime.text import MIMEText
import datetime

def test():
    message = "<p>This is test mail scheduled to send every minute</p>"
    my_email = MIMEText(message, "html")
    my_email["From"] = "xxx@domain.com"
    my_email["To"] = "yyy@domain.com"
    my_email["Subject"] = "Title"

    sender = "person1@domain.com"
    receivers = ["person2@domain.com"]

    with SMTP("localhost") as smtp:
        smtp.login(sender, "yyy@1234")
        smtp.sendmail(sender, receivers, my_email.as_string())

实际问题:

crontab 现在可以调用 exec.sh 文件,并且我可以在 echo 中打印 $CWD,当调用cron.py时,它无法识别 django.core.mail 并引发以下错误。

from django.core.mail import send_mail
ImportError: No module named django.core.mail

我想,我需要在某处设置虚拟环境或 python 变量路径,但由于我是 crontab 新手,我不知道该怎么做。

任何帮助表示赞赏。提前致谢。

4

2 回答 2

1

是的,你是对的,你可能需要使用虚拟环境(虽然它是可选的,但最好的做法)。

创建虚拟环境(需要先安装python)

python -m venv venv

激活(路径可能因操作系统而异(我的是 windows))

source venv/Scripts/activate

在虚拟环境中安装依赖

pip install Django

现在你们都准备好使用虚拟环境的 Django 了。

which python应该映射到 venv 路径。

现在你有两种方法来运行 python 脚本 #1 使用直接 python 路径

absolute/path/of/venv/bin/python3 -c 'import proj_application.cron as cron; cron.test()'

#2 激活虚拟环境并使用相同的 bash 脚本。

#!/bin/bash
cd "$(dirname "$0")";
CWD="$(pwd)"
echo $CWD
source venv/Scripts/python   # this will be in windows
python -c 'import proj_application.cron as cron; cron.test()'
于 2020-07-17T18:57:13.893 回答
1

我对此的解释是,您通常在虚拟环境中运行脚本,现在将其添加到 cron 作业中失败了。如果这不正确,请跳到最后一段。

要通过虚拟环境运行cron作业,您需要使用虚拟环境的python作为您想要的python。例如运行 cron.py 文件:

* * * * * /path/to/venv/bin/python3 /path/to/cron.py >> /Users/ashwin/dashboard/proj_application/data.log 2>&1

这是我建议这样做的方式,因为它似乎并不完全需要 shell 脚本(其中的任何内容都可以在 python 脚本的顶部轻松完成),但如果是的话,你可以在哪里做类似的事情您调用虚拟环境的 python 而不是默认的 python。像这样:

/path/to/venv/bin/python3 -c 'import proj_application.cron as cron; cron.test()' 

但是,如果这不起作用,这可能不是 cron 作业的问题,而是邮件客户端的 django 设置(例如,确保它包含在已安装的应用程序中等)

由于有点不清楚您的问题出在哪里(邮件客户端设置、cron 设置、venv 配置等),如果您确定运行通常在虚拟环境中运行的脚本存在问题,那么这些步骤应该会有所帮助,否则我会确保您的邮件客户端配置正确。通过在控制台中运行它们(而不是通过 cron 作业)来确保你的脚本是正确的,然后你可以回来更新帖子,提供关于你遇到的问题所在的更详细的信息。

于 2020-07-17T18:45:49.947 回答