使用Click库的Python 3.6没有模块错误

2024-05-21 01:33:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图通过使用包click在python中构建CLI。我使用的Python版本是3.6

这是我申请的主要内容:

import os
import click

cmd_folder = os.path.join(os.path.dirname(__file__), 'commands')


class IAMCLI(click.MultiCommand):

    def list_commands(self, ctx):
        rv = []
        for filename in os.listdir(cmd_folder):
            if filename.endswith('.py') and \
                    filename.startswith('cmd_'):
                rv.append(filename[4:-3])
        rv.sort()
        return rv

    def get_command(self, ctx, cmd_name):
        ns = {}
        fn = os.path.join(cmd_folder, 'cmd_{}.py'.format(cmd_name))
        with open(fn) as f:
            code = compile(f.read(), fn, 'exec')
            eval(code, ns, ns)
        return ns['cli']


@click.command(cls=IAMCLI)
@click.option('--env', default='dev', type=click.Choice(['dev', 'staging', 'production']),
              help='AWS Environment')
@click.pass_context
def cli():
    """AWS IAM roles and policies management CLI."""
    pass


if __name__ == '__main__':
    cli()

这就是树:

├── cli
│   ├── __init__.py
│   ├── aws
│   │   ├── __init__.py
│   │   ├── policy.py
│   │   └── role.py
│   ├── cli.py
│   └── commands
│       ├── __init__.py
│       └── cmd_dump.py

cmd_dump.py看起来如下:

import click

from cli.aws.role import fetch_roles


@click.command('dump', short_help='Dump IAM resources')
@click.pass_context
def cli():
  pass

问题是,当我试图运行python cli/cli.py --help时,我得到的是:

File "cli/commands/cmd_dump.py", line 3, in <module>
    from cli.aws.role import fetch_roles
ModuleNotFoundError: No module named 'cli.aws'; 'cli' is not a package

你知道吗?


Tags: pyimportcmdawscliosdefpass