Python 单击“不检测组中的命令”

Python 单击“不检测组中的命令”,python,argparse,python-click,Python,Argparse,Python Click,我有以下配置: mymodule/\uuuu init\uuuu.py: @click.group() @click.option('--env', required=True, type=str, help='Environment: t1, t2, t22,..., s, p', default=lambda: getenv("APP_ENV")) @click.option('--load-type', help='Load type', type=str) @click.option('

我有以下配置:

mymodule/\uuuu init\uuuu.py:

@click.group()
@click.option('--env', required=True, type=str, help='Environment: t1, t2, t22,..., s, p', default=lambda: getenv("APP_ENV"))
@click.option('--load-type', help='Load type', type=str)
@click.option('--start-date', default=None, help='Start date', type=str)
@click.option('--end-date', default=None, help='End date', type=str)
@click.pass_context
def cli(ctx, env, load_type, start_date, end_date):
    ctx.ensure_object(dict)
    ctx['env'] = env
    ctx['load_type'] = load_type
    ctx['start_date'] = start_date
    ctx['end_date'] = end_date
foo.py

from . import cli

@cli.command()
@click.pass_context
def foo(ctx):
    with App(ctx['env'], ctx['load_type'], ctx['start_date'], ctx['end_date']) as app:
        app.start()
和setup.py

    'console_scripts': [
        'app=mymodule:cli'
    ]
当我运行应用程序--help时,我得到以下信息:

(myvenv) bash$ app --help
Usage: app [OPTIONS] COMMAND [ARGS]...

Options:
  --env TEXT         Environment: t1, t2, t22,..., s, p  [required]
  --load-type TEXT   Load type
  --start-date TEXT  Start date
  --end-date TEXT    End date
  --help             Show this message and exit.
但是,我没有获得可用命令的部分,其中一个是foo

也就是说,我需要看到:

(myvenv) bash$ app --help
Usage: app [OPTIONS] COMMAND [ARGS]...

Options:
  --env TEXT         Environment: t1, t2, t22,..., s, p  [required]
  --load-type TEXT   Load type
  --start-date TEXT  Start date
  --end-date TEXT    End date
  --help             Show this message and exit.

Commands:
  foo

因此,我必须将所有内容都放在同一个python文件中,如下所示:

@click.group()
@click.option('--env', required=True, type=str, help='Environment: t1, t2, t22,..., s, p', default=lambda: getenv("APP_ENV"))
@click.option('--load-type', help='Load type', type=str)
@click.option('--start-date', default=None, help='Start date', type=str)
@click.option('--end-date', default=None, help='End date', type=str)
@click.pass_context
def main(ctx, env, load_type, start_date, end_date):
    ctx.ensure_object(dict)
    ctx.obj['env'] = env
    ctx.obj['load_type'] = load_type
    ctx.obj['start_date'] = start_date
    ctx.obj['end_date'] = end_date

def start(ctx, class_type):
    with class_type(env=ctx.obj['env'], load_type=ctx.obj['load_type'], start_date=ctx.obj['start_date'], end_date=ctx.obj['end_date']) as app:
        app.start()


@main.command()
@click.pass_context
def cmd1(ctx):
    start(ctx, iVolatilityPrices)

@main.command()
@click.pass_context
def cmd2(ctx):
    start(ctx, iVolatilityRefData)

@main.command()
@click.pass_context
def cmd3(ctx):
    start(ctx, iVolatilitySurfaceData)

if __name__ == '__main__':
    main(obj={})
然后在
setup.py
中,我将
app
命令指向上面的
main
函数。然后我将获得
main
命令,并显示以下菜单:

(myvenv) bash$ app
Usage: app [OPTIONS] COMMAND [ARGS]...

Options:
  --env TEXT         Environment: t1, t2, t22,..., s, p  [required]
  --load-type TEXT   Load type
  --start-date TEXT  Start date
  --end-date TEXT    End date
  --help             Show this message and exit.

Commands:
  cmd1
  cmd2
  cmd3

@stephernauch
mymodule
是带有click config的init.py脚本所在的位置。我已经弄明白了——所有东西都必须在同一个文件中(见我的答案)。您可能会将其拆分为多个文件,但随后必须使用单击组调用
add_命令()
,这会破坏将其包含在多个文件中而不必编辑组文件的好处。