Argparse:带有store_true标志的可选子分析器

时间:2013-10-03 03:04:26

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

如果我的术语已关闭,请原谅我,但我正在寻找一种方法将subparser添加到可选的argparse参数中,每个args上都有store_true个标志。

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

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')

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您需要将开关从“-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")

答案 1 :(得分:0)

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可选(标志)与subparser名称有什么关系吗?它的目的是什么?你是否将旗帜与subparser混淆了?

subparser也是一个位置。同时使用nargs='+'和subparser的位置可能会有效,但可能会引起混淆。 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解释为subparser命令。但它与可用的选择不匹配。

我认为这些行可行:

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

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

至于获取args.shodan.html,这是一个更高级的问题,涉及命名空间的嵌套。现在开心,如果你得到args.html