【问题标题】:How to get Celery to load the config from command line?如何让 Celery 从命令行加载配置?
【发布时间】:2026-02-07 09:00:01
【问题描述】:

我正在尝试使用celery worker 在命令行加载配置文件:

celery worker --config=my_settings_module

这似乎不起作用。 celery worker 启动并使用其默认设置(包括假设在 localhost:5672 上有一个 RabbitMQ 服务器可用)在我的配置中,我想将 celery 指向不同的地方。当我将配置文件中的 amqp 设置更改为某些内容时,Celery 似乎并不在意。它仍然显示默认的 RabbitMQ 设置。

我也尝试过一些假的

celery worker --config=this_file_does_not_exist

Celery 再一次不在乎。 worker 启动并附加到默认的 RabbitMQ。它甚至没有查看 --config 设置

我读到了 Celery 是如何延迟加载的。我不确定这与此有什么关系。

如何让 celery worker 遵守 --config 设置?

【问题讨论】:

  • 从包含你的模块的目录(也就是你拥有 celery.py 的上一级目录),试试这个:celery worker -A module_name
  • 这将识别并加载一个应用模块。如果我指定它,它可以做到这一点。但这并不能帮助我使 --config 命令行参数正常工作。如何让 --config 做某事?

标签: python celery


【解决方案1】:

我遇到了完全相同的错误,但我最终发现我在配置模块本身中犯了简单的选项命名错误,这些错误一点都不明显。

您会发现,当您开始并按照教程进行操作时,您最终会在主模块中看到如下所示的内容:

app = Celery('foo', broker='amqp://user:pass@example.com/vsrv', backend='rpc://')

这很好用,但是后来随着您添加越来越多的配置选项,您决定将选项移动到单独的文件中,此时您继续复制+粘贴并将选项拆分为行,直到看起来像这个:

天真的 my_settings.py:

broker='amqp://user:pass@example.com/vsrv'
backend='rpc://'
result_persistent=True
task_acks_late=True
# ... etc. etc.

然后你就自欺欺人了!因为在设置模块中选项被称为broker_urlresult_backend,而不是像在上面的实例化中那样只调用brokerbackend

更正了 my_settings.py:

broker_url='amqp://user:pass@example.com/vsrv'
result_backend='rpc://'
result_persistent=True
task_acks_late=True
# ... etc. etc.

突然之间,您的工作人员在所有设置都到位的情况下正常启动。

我希望这能治愈像我们这样的芹菜新手的一些头痛。

补充说明:
您可以通过在设置模块中放置打印语句(或打印函数调用,如果您在 Py3 上)来测试 celery 实际上不会忽略您的文件。

【讨论】:

    【解决方案2】:

    如果你给出了一些无效的模块名或不在PYTHONPATH 中的模块名,比如celery worker --config=invalid_foo,celery 会忽略它。

    您可以通过创建一个简单的配置文件来验证这一点。

    $ celery worker -h
    
    --config=CONFIG       Name of the configuration module
    

    正如 celery worker help 中提到的,你应该通过配置模块。否则会报错。

    如果你只是运行

    celery worker
    

    它将启动 worker 并且其输出将被着色

    在同一目录中,使用此行创建一个名为 c.py 的文件。

    CELERYD_LOG_COLOR = False
    

    现在运行

    celery worker --config=c
    

    它将启动 worker 并且其输出将不着色

    如果你运行celery worker --config=c.py,会报错。

    celery.utils.imports.NotAPackage: Error: Module 'c.py' doesn't exist, or it's not a valid Python module name.
    Did you mean 'c'?
    

    【讨论】:

    • 这个答案实际上并没有回答这个问题。如果您阅读原始帖子,作者说他试图设置 --config= 并且它被忽略了。我在 mo' 遇到了同样的问题。
    • 如果你给出了无效的模块名称或不在 python 路径中的模块,celery 将忽略它。确保您的模块在 python 路径中,然后将其传递给--config,然后 celery 将拾取它。这有帮助吗?
    • 如果我没看错(也许我没看懂)作者尝试过使用...哦等等,这就是重要的一点吗?配置模块是否必须在 python 路径中?如果是这样,我没有从你的回答中得到这个(我很抱歉)。