【问题标题】:Command line with Python使用 Python 的命令行
【发布时间】:2018-05-08 04:50:08
【问题描述】:

我正在开发一个简单的项目或学习 Python,实际上我有 3.6 版,我想构建一个命令行工具来生成具有特定条件的密码。所以票价就是我得到的:

import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-a", "-auto", help="auto mode", action="store_true")
group.add_argument("-m", "-manual", help="manual mode", action="store_true")
parser.parse_args() 

死胡同是我不知道如何限制命令,例如-l -lenght 到有-m 另一个停止的要求是,我如何定义-l 以便它可以接受一个值,例如-l:8 指定 8 个字符的密码,我还想对 -l 值设置范围限制,例如 -l:8-256,最后,我在定义参数时不明白 --- 之间的区别。

我已经完成了生成密码的所有部分,只需要一种从外部控制其流动的方法,因此实现参数看起来是一种很好的方法。

【问题讨论】:

    标签: python python-3.x command-line


    【解决方案1】:

    您正在寻找的是选择选项。

    add_argument('--length', type=int, choices=range(8,257)

    这将只接受 8 到 256(含)之间的整数值。

    至于第二个问题,- 表示选项的简写,这在大多数 CLI 工具中很常见,-- 表示长写。常见的做法是 CLI 工具为选项提供长手和短手。

    【讨论】:

    • 我如何将参数设置为仅与另一个参数一起使用,例如,我只能在运行时指定 -l -m 而在自动模式中我不能这样做并且不会接受长度值。
    • 最好在解析完所有选项后在后处理中完成。
    • 可能知道你不能用 argparse 做到这一点,但这是一个非常简单的 if 语句,可以在你的参数被解析后完成
    • 请注意,如果您像这样使用choices,您的使用消息将显示所有 240+ 个值。
    • @chepner 解决此问题的一种简单方法是使用 metavar 选项更改用法。结帐stackoverflow.com/questions/25295487/… 以获得解释
    【解决方案2】:

    您可以定义一个自定义类型来检查有效值:

    from argparse import ArgumentTypeError
    
    def passwd_len(s):
        try:
            s = int(s)
        except ValueError:
            raise ArgumentTypeError("'%s' is not an integer" % (s,))
    
        if not (8 <= s <= 256):
            raise ArgumentTypeError("%d is not between 8 and 256, inclusive" % (s,))
    
        return s
    
    parser.add_argument("--length", "-l", type=passwd_len)
    

    --- 之间的区别是约定之一。从历史上看,选项是以- 为前缀的单字母参数,并且可以组合选项组:-ab-a -b 相同。为了 支持该约定并且允许更长的选项名称,一个新的约定 设计了使用-- 为多字符名称添加前缀的方法。 --length 是一个选项,而不是一组六个选项 -l-e-n-g-t-h。长选项不能分组。

    我会像这样定义-a-m 选项:

    group = parser.add_mutually_exclusive_group()
    group.add_argument("-a", "--auto", help="auto mode", action="store_const", const="auto", dest="mode")
    group.add_argument("-m", "--manual", help="manual mode", action="store_const", const="manual", dest="mode")
    group.add_argument("--mode", choices=["auto", "manual"])
    

    现在,您不再拥有两个永远不会具有相同值的布尔属性,而是只有一个属性可以直接检查其值。将--mode 视为选择模式的规范方式,将-a-m 视为选择特定模式的快捷方式。

    【讨论】:

    • 拥有第三个名为--mode 的属性有什么好处?仅使用-a-m
    • 您可以完全放弃该选项,并且仍然将-a-m 作为设置mode 目标的唯一方法。作为事后的想法,我把它扔了进去。 (您可以将其视为展示您在设置单个目的地时的灵活性。)
    猜你喜欢
    • 2020-05-05
    • 2018-12-28
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多