在Heroku上运行Django自定义manage.py任务 - 导入问题

5 投票
2 回答
3255 浏览
提问于 2025-04-17 07:42

我正在尝试在Heroku上将一个自定义的Django命令作为定时任务运行。我可以在本地通过命令 python manage.py send_daily_email 来执行这个自定义命令。(注意:我对这个自定义管理命令本身没有任何问题)

但是,当我通过Heroku Scheduler插件尝试“运行”这个任务时,Heroku给了我以下错误信息:

Traceback (most recent call last):
  File "bin/send_daily_visit_email.py", line 2, in <module>
    from django.conf import settings
ImportError: No module named django.conf

我在/bin/send_daily_email.py放置了一个Python脚本,内容如下:

#! /usr/bin/python
from django.conf import settings
settings.configure()
from django.core import management

management.call_command('send_daily_email') #delegates off to custom command

在Heroku中,我可以运行 heroku run bin/python 来启动Python环境,并成功从 django.conf 导入 settings

我很确定这和我的 PYTHON_PATH 或者Django的 SETTINGS_MODULE 的可见性有关,但我不太确定该如何解决这个问题。有人能给我指个方向吗?有没有更简单的方法来实现我想做的事情?

非常感谢你们的建议和提示!我刚接触Heroku! :)

编辑:

根据Nix的评论,我做了一些调整,发现指定我的确切Python路径后,确实可以顺利通过Django的设置。

现在我收到:

  File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 155, in call_command
    raise CommandError("Unknown command: %r" % name)
django.core.management.base.CommandError: Unknown command: 'send_daily_email'

不过,当我运行 ``heroku run bin/python app/manage.py``` 时,我可以看到'send_daily_email'。

如果我找到答案,我会继续更新。

2 个回答

2

另外,你还可以通过把你的家目录添加到Python的路径中来解决这个问题。一个简单又不麻烦的方法就是把它加到PYTHONPATH这个环境变量里(在Heroku Cedar平台上,通常是/app)。

你可以通过heroku config命令来添加:

$ heroku config:add PYTHONPATH=/app

这样就可以了!想了解更多细节,可以查看这个链接: http://tomatohater.com/2012/01/17/custom-django-management-commands-on-heroku/

4

你可能在使用不同的解释器。

检查一下你在脚本中引用的 /usr/bin/python 和你在命令行中使用的 Python 是否是同一个。可能你的路径中有其他的 Python 版本,这就解释了为什么运行 python manage.py 时可以正常工作,但在你明确指定 /usr/bin/python 的脚本中却不行。


输入 which python 可以告诉你在路径中找到的是什么解释器。

撰写回答