私はPythonでclick
パッケージを使用して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
は次のようになります。
3.6
これは私のアプリケーションのメインであります
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
それについては何か考えてください。
'cli.py'の親ディレクトリは' sys.path'の前に置かれていますので、 'aws.role.fetch_roles'をcli.pyスクリプトからインポートしようとしています。 – vaultah
ここでは、 'os.path.join(cmd_folder、 'cmd _ {}。py'.format(cmd_name))'と書いてありますか? – Mazzy
修正方法が不明です。何か案が? – Mazzy