Celery错误:无法识别的参数:-A,Flask,argparse。

3
在一个基于 Flask 的 Web 应用程序中,使用 argparse 获取两个命令行参数:ini 文件名和端口号。在同一文件中定义了 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

-------CELERY配置-------

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。 - user2264738
celery -h 对我来说运行正常。 - user2264738
我会尝试两件事情 - 显示 sys.argv。这就是你的解析器正在读取的内容。我们需要知道它看到了什么。并使用 parse_known_args(请参阅文档),以便解析器不会因为无法识别的东西而窒息。 - hpaulj
2个回答

4

我遇到过类似的问题,argparse也对我报错了。

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

args, unknown = parser.parse_known_args()

来源: Python argparse ignore unrecognised arguments

丑陋的修复方法: 将celery工作器参数定义为您的主应用程序的argparse的一部分

"正确的"修复方法: 考虑在主函数中使用argparse,这样celery就不会与其冲突了

Handling argparse conflicts


1
您需要重新排序参数:

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

这没有帮助,我认为 celery argparse 上下文正在发生改变。 - user2264738
2
请考虑编辑您的帖子,添加更多关于代码功能和解决问题的原因的说明。大部分只包含代码(即使它可以工作)的答案通常无法帮助提问者理解他们的问题。 - SuperBiasedMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接