如果我的术语取消了,请原谅我,但是我正在寻找一种方法,将子解析器添加到一个可选的arg解析参数中,每个arg上都有store_true标志。
理想情况下,我希望使用以下语法来引用--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')有什么建议吗?
发布于 2013-10-03 16:44:46
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我建议放弃整个子解析器位。对你和你的用户来说,这只是让人困惑的事情。继续,并在主解析器中包含--html。它是可选的,因此可以随意使用,也可以忽略它。您必须使用子解析器,查看文档,并尝试一些简单的示例。
至于获取args.shodan.html,这是一个更高级的问题,涉及名称空间的嵌套。现在,如果你得到了args.html,那就开心吧。
发布于 2013-10-03 04:14:44
您需要将开关从"-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")https://stackoverflow.com/questions/19150074
复制相似问题