【问题标题】:Argparse: optional subparsers with store_true flagsargparse:带有 store_true 标志的可选子解析器
【发布时间】:2013-10-09 14:43:05
【问题描述】:

如果我的术语不正确,请原谅我,但我正在寻找一种将子解析器添加到可选 argparse 参数的方法,每个 args 上都有 store_true 标志。

理想情况下,我想使用以下语法在 shodan_parser 子解析器中引用 --html 的布尔值:

if args.shodan.html:
    print("Doing a thing") 

parser = argparse.ArgumentParser()
parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true")
parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true")
parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+")

subparsers = parser.add_subparsers()
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options")
shodan_parser.add_argument("--html", action="store_true")
shodan_parser.set_defaults(which='shodan')

输出:

(venv)[nott@admin gumdrop]$ python gumdrop.py google.ca --shodan --html
usage: gumdrop.py [-h] [-r] [-e] [-s] targets [targets ...] {shodan} ...
gumdrop.py: error: too few arguments

(venv)[nott@admin gumdrop]$ python gumdrop.py --shodan --html google.ca askjeeves.ca
usage: gumdrop.py [-h] [-r] [-e] [-s] targets [targets ...] {shodan} ...
gumdrop.py: error: invalid choice: 'askjeeves.ca' (choose from 'shodan')

有什么建议吗?

【问题讨论】:

  • Python 2 对吗?您能否根据您计划提供的命令行参数发布预期的输出?
  • 我不确定您所说的预期输出是什么意思。我希望能够为shodan.html 设置一个布尔标志,但我不确定这是否可能。
  • 你能提供一个你想输入的命令行参数的例子吗?
  • python module.py --shodan -h 它可能会变得一团糟。我不确定我还能如何处理它。
  • 请注意,您将无法执行 -h 因为它与 argparse 默认值 -h 冲突以寻求帮助。所以你必须做--html。

标签: python python-2.7 command-line-arguments argparse


【解决方案1】:
parser = argparse.ArgumentParser()
parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true")
parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true")
parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+")

这个--shodan 可选(标志)与子解析器名称有什么关系吗?它的目的是什么?您是否将标志与子解析器混淆了?

子解析器也是一个位置。使用带有nargs='+' 的位置和子解析器可能会起作用,但可能会导致混淆。 targets 列表何时结束,子解析器(及其参数)何时开始?

subparsers = parser.add_subparsers()
shodan_parser = subparsers.add_parser("shodan", help="SHODAN options")
...

你的输出

(venv)[nott@admin gumdrop]$ python gumdrop.py google.ca --shodan --html
....

我猜这会设置targets=['google.ca']shodan=True。但是你还没有给它一个子解析器命令。 --html 是未知数。

(venv)[nott@admin gumdrop]$ python gumdrop.py --shodan --html google.ca askjeeves.ca
...

现在你设置shodan=True(主解析器标志)。同样--html 是未知的。它设置target=['google.ca']。但现在它试图将askjeeves.ca 解释为子解析器命令。但它与可用的选项不匹配。

我认为这些行会起作用:

python gumdrop.py google.ca askjeeves.ca shodan --html
python gumdrop.py --shodan google.ca shodan --html

我建议删除整个 subparser 位。对于您和您的用户来说,这只是令人困惑的事情。继续在主解析器中包含--html。它是可选的,因此可以随意使用或忽略。您必须使用子解析器、查看文档并尝试一些更简单的示例。

至于获取args.shodan.html,这是一个更高级的问题,涉及命名空间的嵌套。现在,如果您收到args.html,请感到高兴。

【讨论】:

    【解决方案2】:

    您需要将开关从“-h”更改为其他内容(或禁用帮助),因为“-h”开关已被帮助菜单使用

    parser = argparse.ArgumentParser()
    parser.add_argument("-r", "--reverse-dns", help="rDNS on host", action="store_true")
    parser.add_argument("-s", "--shodan", help="perform SHODAN query on discovered IPs", action="store_true")parser.add_argument("targets", help="IPv4 addresses to search for", nargs="+")
    
    subparsers = parser.add_subparsers()
    shodan_parser = subparsers.add_parser("shodan", help="SHODAN options")
    shodan_parser.add_argument("--html", action="store_true")
    shodan_parser.set_defaults(which='shodan')
    
    args = parser.parse_args()
    
    if args.html:
        print("Doing a thing")
    

    【讨论】:

    • 用 args.html 作为条件运行脚本的结果更新了我的问题。
    猜你喜欢
    • 2020-09-26
    • 2021-01-10
    • 2014-06-14
    • 2012-01-21
    • 2022-11-19
    • 2013-12-21
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多