slow response of CLI written with Python Click
Asked Answered
E

1

9

I'm experiencing slow responses of my CLI written with Click 7.0 on Python 3.6.6 (under conda environment).

It takes time to print the help message when calling the CLI when the package has been installed with pip (using setuptools):

$ time cli
Usage: cli [OPTIONS] COMMAND [ARGS]...

  Welcome in the CLI!

Options:
  --version  Show the version and exit.
  --help     Show this message and exit.

real    0m0,523s
user    0m0,482s
sys     0m0,042s

However, I don't get this lag when calling the CLI directly from the source:

$ time python myproject/cli.py 
Usage: cli.py [OPTIONS] COMMAND [ARGS]...

  Welcome in the CLI!

Options:
  --version  Show the version and exit.
  --help     Show this message and exit.

real    0m0,088s
user    0m0,071s
sys     0m0,016s

Here is the content of myproject/cli.py:

import click

@click.group('cli', invoke_without_command=True)
@click.pass_context
@click.version_option(version='0.0.1', prog_name="test")
def cli(ctx):
    """
    Welcome in the CLI!
    """

    if ctx.invoked_subcommand is None:

        # show help if no option passed to cli
        if all(v==False for v in ctx.params.values()):
            click.echo(ctx.get_help())

if __name__ == '__main__':
    cli()

And setup.py is configured like this:

setup(
    name=name,
    version=__version__,
    packages=find_packages(),  
    install_requires=install_requires,
    author=author,
    author_email=author_email,
    description=description,
    entry_points='''
        [console_scripts]
        cli=myproject.cli:cli
    ''',
    keywords=keywords,
    cmdclass=cmdclass,
    include_package_data=True,
)

Could someone help me with this? This is really inconvenient to get such lag for a CLI.

Eiland answered 9/11, 2018 at 9:40 Comment(2)
This is not a click issue. Some info: bugs.python.org/issue33902. Also there is no click 7.9 that I am aware of.Healthful
Ok thanks for the info @StephenRauch. Click 7.9 was a typo, it's corrected now.Eiland
H
0

For small Python CLIs this delay is very noticable. It has to do with the wrapper that setuptools creates around your CLI endpoint. It implements some auxiliary functionality with your endpoint, like checking that your (virtual) python environment has all required dependencies.

People have created solutions to circumvent these auxilary functionalities with tools like fast-entry_points. Check it out, it might suite your use-case.

Note: This speed improvement is mostly noticeable for small CLIs. If you have a larger CLI/Project, you will need to structure your imports as local imports to prevent all imports being loaded when you perform a specific action. Especially when using auto-complete on your CLI, it might be worth to also change your imports.

Haustellum answered 26/1, 2022 at 7:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.