[英]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.