gpt4 book ai didi

python - 带有 Click 库的 Python 3.6 中没有模块错误

转载 作者:太空狗 更新时间:2023-10-30 02:38:28 26 4
gpt4 key购买 nike

我正在尝试使用 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

有什么想法吗?

最佳答案

在开始开发新的python项目时,我会尝试根据我的方法给出另一个答案。您打算分发您的项目,还是只是与某人分享?如果你这样做,你怎么看 - 这个人会因为需要记住命令而感到高兴吗

$ python path/to/project/codebase/cli/cli.py --help

使用你的工具?让他记住命令不是更容易吗

$ cli --help

代替?

我建议您立即开始打包您的项目 - 编写一个最小的安装脚本:

from setuptools import setup, find_packages

setup(
name='mypkg',
version='0.1',
packages=find_packages(),
install_requires=['click'],
entry_points={
'console_scripts': ['cli=cli.cli:cli'],
},
)

当出现新需求时,您始终可以增强设置脚本。将设置脚本放在代码库的根目录中:

├── setup.py
├── cli
│   ├── __init__.py
│   ├── aws
...

现在运行 python setup.py develop 或更好,从代码库根目录(其中setup.py脚本是)。您已经在开发模式下安装了您的项目,现在可以调用

$ cli --help

正确解析所有导入(这将解决您的问题)。但除此之外,您获得了更多 - 您获得了一种打包项目以准备分发给目标用户的方法,以及一个干净的命令行界面,您的用户将以与您刚才相同的方式调用该界面。

现在继续项目开发。如果您更改 cli 命令的代码,它将即时应用,因此您无需在每次更改任何内容时都重新安装项目。

一旦您准备好项目开发并希望将其交付给您的用户,请发出:

$ python setup.py bdist_wheel

这会将您的项目打包到可安装的 wheel 文件中(您需要安装 wheel 包才能调用命令:pip install wheel - -用户)。通常它将驻留在代码库根目录的 dist 子目录中。将此文件提供给用户。要安装文件,他会发出

$ pip install Downloads/mypkg-0.1-py3-none.whl --user

并且可以立即开始使用您的工具:

$ cli --help

这是一个非常简化的描述,有很多东西需要学习,但也有大量有用的 Material 可以指导您完成整个过程。

如果您想了解有关该主题的更多信息:作为快速入门引用,我会推荐出色的 PyPA packaging guide .对于打包 click 命令,their own docs are more than sufficient .


  1. 我鼓励您在适用的情况下使用 pip 进行分发和打包开发,因为它是这方面的标准工具。

关于python - 带有 Click 库的 Python 3.6 中没有模块错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46889031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com