Python 为我的Django应用程序设置crontab

Python 为我的Django应用程序设置crontab,python,python-3.x,django,sendmail,django-cron,Python,Python 3.x,Django,Sendmail,Django Cron,我在为Django应用程序设置crontab一周时遇到了一个问题,我几乎也解决了这个问题。(有关问题) 我的crontab-e语法是 * * * * * /Users/ashwin/dashboard/proj_application/exec.sh >> /Users/ashwin/dashboard/proj_application/data.log 2>&1 在我的exec.sh中,我有 #!/bin/bash cd "$(dirname "

我在为Django应用程序设置crontab一周时遇到了一个问题,我几乎也解决了这个问题。(有关问题)

我的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())
我想,我需要在某个地方设置虚拟环境或python变量路径,但由于我是crontab新手,我不确定如何做到这一点


感谢您的帮助。提前感谢。

我的解释是,您通常在虚拟环境中运行脚本,现在将脚本添加到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作业),确保脚本正确无误,然后您可以返回并更新文章,提供有关问题所在的更详细信息。

是的,您可能需要使用虚拟环境(尽管它是可选的,但是最佳实践)

创建虚拟环境(希望在安装之前安装python)

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

在虚拟环境中安装依赖项

pip install Django
现在,您都可以使用virtual env的Django了

哪个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()'

非常感谢您的回复。我尝试过,但由于某种原因,我无法通过crontab激活虚拟环境。我找到了另一种方法,从Jenkins激活了cron作业,并且我能够调用自定义管理命令在预定时间内执行该函数:)很高兴看到@Ashwin,jus,以防您想了解如何执行Python脚本,请查看此链接。谢谢非常感谢你。在过去的几篇文章中,你一直在提供帮助。我无法使用django crontab或芹菜来实现它,因此最终我创建了一个自定义管理命令(cron),如中所示,并能够从jenkins的工作中调用python3.7 manage.py cron
pip install Django
absolute/path/of/venv/bin/python3 -c 'import proj_application.cron as cron; cron.test()'
#!/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()'