2013-02-17 79 views
3

我已經做了很多操作的Python腳本,所以它有很多選項,所以我將它劃分爲也使用父解析器進行常見選項分組的子分析器。如何在argparse中顯示所有子分析器的幫助?

我想要一個幫助選項,將顯示所有命令的幫助與他們的選項,有沒有可能不覆蓋format_help方法?

我看到一個similar question,但分組對我來說並不重要,我只想要那裏的選項。

例如:

general_group = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,add_help=False) 
general_group.add_argument('--threads', action='store_true', default=False) 
second_group = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,add_help=False) 
second_group.add_argument('--sleep', action='store', default=60, type=int) 
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) 
subparsers=parser.add_subparsers(dest='action') 
subparsers.add_parser('Restart',parents=[general_group,second_group]) 
subparsers.add_parser('Start',parents=[general_group]) 

args = parser.parse_args() 

在這種情況下,我想,如果有人運行./script.py -h他們會看到在幫助線程選項。

+2

是否有一個原因,爲什麼你逝去'parents'參數分析器?使用'general_group'作爲「父」(意思是'subparsers = general_group.add_subparsers()')和* not *傳遞'parents = [']''''''時會​​顯示* --threads'選項./ script.py -h'。 – Bakuriu 2013-02-17 08:39:03

+0

是的,我有3個這樣的團體...... – 2013-02-17 08:53:41

+0

那麼你發佈的不是一個最小的工作示例。發佈一些代碼,顯示你正在嘗試做什麼。 – Bakuriu 2013-02-17 09:44:31

回答

4

的問題是,在線路:

subparsers=parser.add_subparsers(dest='action') 
subparsers.add_parser('Restart',parents=[general_group,second_group]) 
subparsers.add_parser('Start',parents=[general_group]) 

你加入general_group父到subparsers,所以主分析器並不知道這些,這將導致./script.py -h不顯示--threads。如果你打算把它作爲所有subparsers的父母,那麼你應該把它作爲頂級解析器父:

parser = argparse.ArgumentParser(parents=[general_group]) 
subparsers=parser.add_subparsers(dest='action') 
subparsers.add_parser('Restart',parents=[second_group]) 
subparsers.add_parser('Start') 

其中在結果:但是那

$ python script.py -h 
usage: script.py [-h] [--threads] {Restart,Start} ... 

positional arguments: 
    {Restart,Start} 

optional arguments: 
    -h, --help  show this help message and exit 
    --threads 

注意,在這種情況下,選擇是部分只有父解析器,而不是subparsers,這意味着以下內容:

$python script.py --threads Start 

是正確的,而:

$ python script.py Start --threads 
usage: script.py [-h] [--threads] {Restart,Start} ... 
script.py: error: unrecognized arguments: --threads 

因爲--threads沒有被子分析器「繼承」。如果你想有--threads也是在子分析器必須在其parents參數指定:

parser = argparse.ArgumentParser(parents=[general_group]) 
subparsers=parser.add_subparsers(dest='action') 
subparsers.add_parser('Restart',parents=[general_group, second_group]) 
subparsers.add_parser('Start', parents=[general_group]) 

這應該做你想要什麼:

$ python script.py -h 
usage: script.py [-h] [--threads] {Restart,Start} ... 

positional arguments: 
    {Restart,Start} 

optional arguments: 
    -h, --help  show this help message and exit 
    --threads 
$ python script.py Start -h 
usage: script.py Start [-h] [--threads] 

optional arguments: 
    -h, --help show this help message and exit 
    --threads 
+0

聽起來像它回答我的問題,我會測試它,如果它的工作,我會標記你的答案被接受,同時投票。 – 2013-02-18 09:44:23

相關問題