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

2024-02-01

我正在尝试使用该包在 python 中构建 CLIclick。我使用的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

the 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

instead?

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

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
...

Now run python setup.py develop or even better, pip install --editable=.1 from the codebase root directory (where the setup.pyscript is). You have installed your project in the development mode and now can invoke

$ cli --help

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

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

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

$ python setup.py bdist_wheel

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

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

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

$ cli --help

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

如果您想了解有关该主题的更多信息:作为快速入门参考,我会推荐优秀的PyPA 打包指南 https://packaging.python.org/。包装用click命令,他们自己的文档就足够了 http://click.pocoo.org/5/setuptools/.


  1. 我鼓励你使用pip用于分发和包装开发(如果适用),因为它是一个标准工具。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Click 库的 Python 3.6 中没有模块错误 的相关文章

随机推荐

  • 如何在 ActionScript 3 中从类实例获取 Class 对象?

    如何获取 actionscript 类的实例Class来自该类的一个实例 在 Python 中 这将是x class 在爪哇语中 x getClass 我知道某些可怕的黑客行为 http actionscript org forums sh
  • 如果选择了父项,则选择子项单选按钮,反之亦然

    我有这样的情况
  • 在 EV3 和 PC 之间发送数据

    我正在对机器人进行编程 它需要在 EV3 和我的笔记本电脑 Windows 之间发送数据 我在 EV3 上运行 pybricks 这使我能够使用 python 进行编码 我已经做了研究 但唯一剩下的就是 2014 年的一些博客 它们也没有帮
  • 这是C# Monad,问题出在哪里?

    读一上一个问题 https stackoverflow com questions 35951818 why can the monad interface not be declared in java 35959910 35959910
  • 使用 VBS 更改 Active Directory 中的密码到期日期

    我正在尝试使用 VBScript 更改 Active Directory 中用户的密码到期日期 我有获取有关用户密码的信息的代码 但我找不到有关如何更改密码的任何信息 任何帮助将不胜感激 这是我的代码 Const SEC IN DAY 86
  • 为什么编译器抱怨对齐?

    我想了解更多关于对齐的信息 为什么 Microsoft 编译器 Visual Studio 2012 Express 会抱怨以下代码片段的对齐情况 declspec align 16 class Foo public virtual Foo
  • seq 和 == 运算符的神秘行为。精度问题?

    我遇到了该函数的某种奇怪 或只是出乎意料 的行为seq 创建简单序列时 某些值无法与 运算符正确匹配 看这个最小的例子 my seq lt seq 0 0 4 len 5 table my seq ok returns 0 0 1 0 2
  • XSLT 聚合 XML 标记值并存储新标记

    我是 xslt 的新手 并尝试使用 XSLT 处理以下 XML
  • 奥尔良任务的交错

    有一个问题here https stackoverflow com questions 54456369 orleans single threaded nature not respected by continuewith其中 Orle
  • 如何使用 knit::spin 注释掉行

    使用时spin包装内knitr 如何简单地注释掉一些东西 使它们看不见旋转 roxygen风格线 被视为出现在报告中的行 通常的 R 注释 被视为R注释并出现在代码块中 仅是文本且开头没有特殊字符的行会导致错误 以 开头的行LaTeX评论
  • PHP 类自动加载

    我有一个 简单框架 其主要实例是 app 现在 实现自动加载器的最佳方法是什么 不使用 Composer 我需要的是有一个处理所有自动加载的类 支持各种名称空间 我有一些方法 困境 起初我认为我应该创建一个处理所有事情的 静态 类 但后来我
  • Boost random::discrete_distribution 构建后如何更改权重?

    好的 可以在 boost random discrete distribution 中给出权重 概率 e g 双倍概率 0 5 0 1 0 1 0 1 0 1 0 1 boost random discrete distributiondi
  • 使用 PowerShell 重命名文件以增加文件编号?

    我有一堆名为 attachment 023940 attachment 024039 attachment 024041 attachment 024103 etc 我需要通过将文件号增加给定的数字来重命名文件 以便它们与数据库中的正确 I
  • gperftools CPU profiler 究竟是如何启动的?

    gperftools 文档 http google perftools googlecode com svn trunk doc cpuprofile html说libprofiler应该链接到目标程序 gcc myprogram c lp
  • 无法从具有多个返回的 Select 中的使用情况推断出 C# 类型参数

    我不认为我做了任何太深奥的事情 但我没有看到任何其他与此相关的问题 以下代码 我已将其简化为要点 在 C 4 中生成编译器错误 但是 类型参数是什么应该是显而易见的 有一个最大公分母 类 A 也明确定义在方法 Frob 的返回类型 难道编译
  • NodeJS base64 图像编码/解码不太工作

    我一直在尝试将发布到nodeJS 和express框架 的图像保存到数据库 但遇到了一些麻烦 忽略所有的 Web 处理 我认为我已经将问题范围缩小到了 Node js 中进行 Base64 编码的方式 我相信下面过于简化的示例应该可以工作
  • 如何将 tibble 导出为 .csv

    我使用 rfm 包进行了 rfm 分析 结果在 tibble 中 我似乎不知道如何将其导出到 csv 我尝试了下面的参数 但它导出了一个空白文件 gt dim bmdata4RFM 1 1182580 3 gt str bmdata4RFM
  • C 中的 #line 关键字

    我试图理解一些代码 但遇到了一个我以前从未见过的关键字 我尝试用谷歌搜索它 但也没有找到任何有关它的信息 char valtext line 1 Values l define INITIAL 0 line 2 Values l int r
  • 如何使用注释在 Spring MVC 中创建默认方法?

    我找不到解决办法 这让我发疯 我映射了 Controller 它使用 RequestMapping 响应多种方法 当没有指定更具体的情况时 我想将其中一种方法标记为默认方法 例如 Controller RequestMapping user
  • 使用 Click 库的 Python 3.6 中没有模块错误

    我正在尝试使用该包在 python 中构建 CLIclick 我使用的Python版本是3 6 这是我的应用程序的主要部分 import os import click cmd folder os path join os path dir