Python 单击“不检测组中的命令”
我有以下配置: mymodule/\uuuu init\uuuu.py: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('
@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_命令()
,这会破坏将其包含在多个文件中而不必编辑组文件的好处。