【问题标题】:How to schedule a job using python and crontab?如何使用 python 和 crontab 安排作业?
【发布时间】:2015-01-11 13:05:09
【问题描述】:

我想使用 python、django 和 crontab 发送一封自动邮件。所以我做了以下事情。

创建了一个 cron_tab.py(位于文件夹 home/myhome/django/myapp/registration/cron_tab.py 中),如下所示:

from django.core.mail import send_mail, EmailMessage,EmailMultiAlternatives

subject, from_email, to = 'hello', 'testmailing@gmail.com', 'robert@gmail.com'
text_content = 'This is an important message.'
html_content = '<p>This is an <strong>important</strong> message.</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()

然后使用终端,我通过发出以下命令进入 crontab

crontab -e

我安排了类似的任务

* 1 * * *  /home/myhome/django/myapp/registration/cron_tab.py

但我没有收到邮件。我究竟做错了什么?请有人帮助我。更改文件模式后,出现以下错误并粘贴回溯

 myhome@myhome:~/django/myapp/registration$ ./cron_tab.py
 from: can't read /var/mail/django.core.mail
 ./cron_tab.py: line 3: subject: command not found
 ./cron_tab.py: line 4: from_email: command not found
 ./cron_tab.py: line 5: to: command not found
 ./cron_tab.py: line 6: text_content: command not found
 ./cron_tab.py: line 7: html_content: command not found
 ./cron_tab.py: line 8: syntax error near unexpected token `('
 ./cron_tab.py: line 8: `msg = EmailMultiAlternatives(subject, text_content, from_email,
 [to])'

【问题讨论】:

    标签: python django crontab


    【解决方案1】:

    我认为您的 cron_tab.py 没有从 setting.py 读取 django 配置。然后你从 shell 运行这个脚本会发生什么?

    无论如何,您应该考虑使用custom management command 来完成这项任务。

    【讨论】:

    • @@catavaran:我更新了我的帖子以及回溯。请尽情享受吧。
    • 您正在尝试将您的脚本作为 shell 脚本运行。要作为 python 运行,请将 #!/usr/bin/env python 添加为脚本的第一行。
    • @@catavaran:我添加了 #!/usr/bin/env python 作为第一行,但我仍然得到同样的错误。
    • @@acatavaran:我将第一行更改为 #!/usr/bin/python。将 cron_tab.py 更改为可执行文件。但仍然错误保持不变
    • 如果python在虚拟环境中怎么办?如何添加第一行脚本
    【解决方案2】:

    问题是您使用的 Python 脚本可能不是可执行文件,并且它没有在该行的第一行声明可执行文件。

    你有两个选择:

    1) 在 cron 调用中添加 python 解释器(在本例中,python 解释器位于 /usr/bin/python:

    • 1 * * * /usr/bin/python /home/myhome/django/myapp/registration/cron_tab.py

    2) 使python脚本可执行(2.1+2.2)

    2.1.- 使文件可执行

    $ chmod +x /home/myhome/django/myapp/registration/cron_tab.py

    2.2.- 编辑文件并在解释器的第一行声明:

    #!/usr/bin/python
    from django.core.mail import send_mail, EmailMessage,EmailMultiAlternatives
    

    【讨论】:

    • @@Juan Fco。 Roco:我也试过你的选择。我得到同样的错误。
    【解决方案3】:
    1. 检查您的 Python 脚本是否可以单独执行。
    2. 检查您的 Python 脚本是否可以通过在 /home/myhome/django/myapp/registration/ 目录上运行 ./cron_tab.py 来执行。如果这不起作用,请在命令行的任意位置执行:chmod +x /home/myhome/django/myapp/registration/cron_tab.py,确保您的脚本以 #!/usr/bin/env python 开头,指向您的 Python 解释器。

    如果您没有使用 Django 的任何其他功能(如模型、查询集等),则这种发送电子邮件的方法应该作为一个单独的脚本工作,而不知道 Django 的任何内容。另一方面,如果使用一些 Django 功能,您将有两种方法来运行此脚本:

    a) 作为management command => 如果使用这种方法,我建议您为 crontab 创建一个单独的脚本,该脚本只会运行:

    cd /home/myhome/django/

    python manage.py &lt;your_command&gt;(在这种情况下:)

    b) 作为一个 Python 脚本加载你的 Django 配置 => 你可以直接运行你的脚本。

    【讨论】:

    • @@avenet:我收到此错误来自:当我从 /home/myhome/django/myapp/ 运行 ./cron_tab.py 时无法读取 /var/mail/django.core.mail登记/。你能告诉我我现在必须改变什么吗?
    • @questionspost 你能把整个回溯粘贴到你的问题上吗?
    • @@avenet:python manage.py 中的 your_command 是什么意思?对不起,我没有得到你。 Coukd你请解释我
    • @@avenet:我在帖子中粘贴了回溯。请看一下。
    • @questionspost 只需将此行作为 Pyhon 脚本的第一行 #!/usr/bin/env python
    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 2019-10-01
    • 2015-04-14
    • 2017-10-31
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多