繁体   English   中英

Argparse:具有store_true标志的可选子解析器

[英]Argparse: optional subparsers with store_true flags

如果我的术语不正确,请原谅我,但我正在寻找一种向可选的argparse参数添加子解析器的方法,每个参数均带有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')

有什么建议么?

您需要将开关从“ -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")
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='+'的位置和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 但是您没有给它一个subparser命令。 --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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM