现在有一个名为
click_repl的库,它可以为您完成大部分工作。我想分享一下我努力让它工作的成果。
唯一的困难是您必须将一个特定命令设置为
repl
命令,但我们可以重新利用@fpbhb的方法,以允许默认调用该命令,如果没有提供其他命令。
这是一个完全工作的示例,支持所有click选项,具有命令历史记录,以及能够直接调用命令而不必进入REPL:
import click
import click_repl
import os
from prompt_toolkit.history import FileHistory
@click.group(invoke_without_command=True)
@click.pass_context
def cli(ctx):
"""Pleasantries CLI"""
if ctx.invoked_subcommand is None:
ctx.invoke(repl)
@cli.command()
@click.option('--name', default='world')
def hello(name):
"""Say hello"""
click.echo('Hello, {}!'.format(name))
@cli.command()
@click.option('--name', default='moon')
def goodnight(name):
"""Say goodnight"""
click.echo('Goodnight, {}.'.format(name))
@cli.command()
def repl():
"""Start an interactive session"""
prompt_kwargs = {
'history': FileHistory(os.path.expanduser('~/.repl_history'))
}
click_repl.repl(click.get_current_context(), prompt_kwargs=prompt_kwargs)
if __name__ == '__main__':
cli(obj={})
这是使用 REPL 的样子:
$ python pleasantries.py
> hello
Hello, world!
> goodnight --name fpbhb
Goodnight, fpbhb.
而要直接使用命令行子命令:
$ python pleasntries.py goodnight
Goodnight, moon.
prompt
函数组合一些东西。 - mkrieger1