Python 芹菜工人和命令行参数

Python 芹菜工人和命令行参数,python,celery,Python,Celery,我正在重构我的代码以使用芹菜工人 以前我使用argparse传递命令行args e、 g 但现在我得到了这个错误 celery -A tasks worker --loglevel=info --environment local celery: error: no such option: --environment 我怎样才能补充呢 如果不需要的话,我不想使用环境变量 e.g export environment=development 芹菜工人不执行您的\uuuuu main\uuuu

我正在重构我的代码以使用芹菜工人

以前我使用argparse传递命令行args

e、 g

但现在我得到了这个错误

celery -A tasks worker --loglevel=info --environment local
celery: error: no such option: --environment
我怎样才能补充呢

如果不需要的话,我不想使用环境变量

e.g export environment=development

芹菜工人不执行您的
\uuuuu main\uuuu

如果要添加其他命令行选项,可以使用
app.user\u options
, 但请注意,它使用的是
optparse
模块,而不是
argparse

有关更多信息,请参见文档中的本节:


通过查看源代码,我找到了处理此问题的方法

在芹菜上添加:

from celery import bootsteps
from celery.bin import Option

....
app.user_options['worker'].add(
    Option('--server', dest='api_server', default='127.0.0.1',
           help='API server to use.')
)

app.conf['API_SERVER'] = '127.0.0.1'

class ConfigBootstep(bootsteps.Step):
    def __init__(self, worker, api_server=None, **options):
        app.conf['API_SERVER'] = api_server

app.steps['worker'].add(ConfigBootstep)
然后在保存任务的文件中添加以下内容:

from celery import current_app
...
@shared_task()
def roboscope():
    API_SERVER = current_app.conf.get('API_SERVER', '127.0.0.1')
我尝试在导入模块时解析API_服务器,使其成为一个模块全局变量,但由于为时过早,因此无法工作。由于我的任务非常繁重,因此多次运行此操作并没有什么坏处。

可以使用worker选项

例如,我必须在一个任务中初始化mongo数据库

from celery import bootsteps
from celery.bin import Option
import mongoConfig
.....


app = Celery('scraper')

app.user_options['worker'].add(
    Option('--mongo', dest='is_mongo_required', default=None, help='Mongo Required')
)

class CustomArgs(bootsteps.Step):

    def __init__(self, worker, is_mongo_required=None, **options):
        # store the api authentication
        if is_mongo_required is not None and is_mongo_required[0] == "true":
            print("Mongo initialization required")
            mongoConfig.init(required=True)


app.steps['worker'].add(CustomArgs)


app.config_from_object('celeryConfig')
要执行的命令

celery worker -A scraper --concurrency=4 --loglevel=info -Q abc,bcd --mongo=true

我知道如何将参数输入bootstep init方法,但如何从任务访问这些参数?或者如何获取它们。。。坦率地说。您可以使用
bootsteps.StartStopStep
类作为基础。通过这种方式,您可以更早地获取值(并将其保存在变量或其他内容中),甚至在worker启动时验证参数的值。”在celery.py上添加:“请原谅,但您不应该与celery的命名空间冲突。选择“芹菜.py”肯定会破坏多模块应用程序。
celery worker -A scraper --concurrency=4 --loglevel=info -Q abc,bcd --mongo=true