簡體   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