【问题标题】:celery: error: unrecognized arguments: -A, Flask, argparse芹菜:错误:无法识别的参数:-A,Flask,argparse
【发布时间】:2015-12-07 23:34:19
【问题描述】:

在基于 Flask 的 Web 应用程序中,使用两个命令行参数 ini 文件名、使用 argparse 的端口号,在同一个文件中还定义了 celery 应用程序。但是在运行 celery 应用程序时出现上述错误。

import argparse
from flask import  Flask
from celery import Celery

app = Flask(__name__)
parser = argparse.ArgumentParser(prog="testpgm")
parser.add_argument('-c','--cfgfile', default='domain.ini', help="provide ini      file path")
parser.add_argument('-p','--port', default=5000, help="-p port number eg - 'python run.py -p <port>, default to 5000")
args = parser.parse_args()
ini_path = args.cfgfile
port = args.port

-------芹菜配置-------

app.config["CELERY_QUEUES"] = (
Queue('queue1', Exchange('queue1'), routing_key='queue1')
)
def make_celery(flaskapp):

   #getting celery broker uri
   celery_broker_uri=         CeleryBrokerWrapper().get_broker_uri(broker,username,password,host,port,vhost) 

   celeryinit = Celery(flaskapp.import_name, broker=celery_broker_uri)
   celeryinit.conf.update(flaskapp.config)
   taskbase = celeryinit.Task

   class ContextTask(taskbase):
      abstract = True

      def __call__(self, *args, **kwargs):
         with app.app_context():
             return taskbase.__call__(self, *args, **kwargs)

   celeryinit.Task = ContextTask
   return celeryinit

celery = make_celery(app)

但是当我使用 celery 运行时

celery -A testpgm.celery worker --loglevel=info --concurrency=5 -Q queue1

我收到类似的错误

testpgm: error: unrecognized arguments: -A testpgm.celery worker --loglevel=info --concurrency=5 -Q queue1

它看起来像一个 argparse 错误,我如何为我的应用程序自定义 argparse,而不会出现 celery 的命令行参数问题..

【问题讨论】:

  • 抱歉打错了,现在我修改为 queue1
  • celery -h 对我来说很好用..
  • 我会尝试 2 件事 - 显示 sys.argv。这就是您的解析器正在读取的内容。我们需要知道它看到了什么。并使用parse_known_args(参见文档),这样解析器就不会阻塞它无法识别的内容。

标签: python-2.7 flask celery argparse


【解决方案1】:

有一个类似的问题,argparse 也为我抱怨。

快速修复:使用 parse_known_args,而不是 parse_args

args, unknown = parser.parse_known_args()

来源: Python argparse ignore unrecognised arguments

丑陋的修复: 将 celery worker args 定义为您的主应用程序所具有的 argparse 的一部分

“做对了”修复: 考虑在你的 main 函数中使用 argparse,这样 celery 就不会与之冲突

Handling argparse conflicts

【讨论】:

    【解决方案2】:

    您需要重新排序参数:

    celery worker -A testpgm.celery --loglevel=info --concurrency=5 -Q queue1
    

    【讨论】:

    • 它没有帮助,我认为 celery argparse 上下文正在发生变化,
    • 请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为何能解决问题的说明。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
    猜你喜欢
    • 2019-07-14
    • 2015-12-24
    • 2021-08-16
    • 2013-06-11
    • 2014-06-26
    • 1970-01-01
    • 2012-09-30
    • 2015-07-20
    相关资源
    最近更新 更多