2013-07-04 64 views
1

argparse參數的順序,我試圖用argparse與子分析器3個fonctionnalities之間進行切換,而一個位置參數應該是通用於所有子分析器。此外,它是關鍵點,我想把位置參數作爲提供的最後一個參數,因爲這是一個輸出文件路徑。這是沒有意義的,我把它一開始(如第一個參數)定義在python

import sys,argparse,os 

files = argparse.ArgumentParser(add_help=False) 
files.add_argument('outfile', help='output mesh file name') 

parser = argparse.ArgumentParser(description="A data interpolation program.",prog='data_interpolate.py', parents=[files]) 

subparsers = parser.add_subparsers(help='Mode command.') 
command_parser = subparsers.add_parser('cmd',help='Pass all argument in command line.',parents=[files]) 
command_parser.add_argument('-min', dest='MINFILE',help='Input file with min values', required=True) 
command_parser.add_argument('-max', dest='MAXFILE',help='Input file with min values', required=True) 
command_parser.add_argument('u', help='Interpolation parameter. Float between 0 and 1. Out of bound values are limited to 0 or 1.') 

subparsers.add_parser('py',help='Pass all argument in python file.',parents=[files]) 
subparsers.add_parser('json',help='Pass all argument in json file.',parents=[files]) 

其中給出:

data_interpolation.py -h 

usage: data_interpolation.py [-h] outfile {cmd,py,json} 

但是,我的意見,不過outFile應在以下的結尾給出:

data_interpolation.py [-h] {cmd,py,json} outfile 

這更有意義,因爲我需要傳遞其他參數值時使用cmd命令。 For intance:

data_interpolation.py cmd -min minfile.txt -max maxfile.txt 0.6 outfile.txt 

我該如何設置argparse纔能有這樣的行爲?

回答

0

對於每個子分析器,您無需指定files作爲parser的父級。

0

(注 - 這是一個老問題)。

positionals的順序由它們所定義的順序來確定。這包括subparsers參數(這是一個具有選擇和特殊操作的位置)。

outfile定義作爲參數傳遞給兩個主解析器和subparsers是多餘的。經由parents定義

Positionals將首先放置。因此,如果'outfile'必須是最後一個,那麼必須爲每個子分析器單獨定義。

它也可以被最後確定爲postional主解析器(子分析器定義之後)。

In [2]: p=argparse.ArgumentParser()  
In [5]: sp=p.add_subparsers(dest='cmd') 
In [6]: spp=sp.add_parser('cmd1') 
In [7]: spp.add_argument('test') 
In [8]: p.add_argument('out') 
In [9]: p.print_help() 
usage: ipython [-h] {cmd1} ... out 
... 

In [11]: spp.print_help() 
usage: ipython cmd1 [-h] test 
... 

In [15]: p.parse_args('cmd1 test out'.split()) 
Out[15]: Namespace(cmd='cmd1', out='out', test='test') 

cmd1被解釋爲子分析器選擇。子分析器將test解釋爲位置。 out遺留下來,然後返回到主解析器以便使用。如果子分析器不返回任何額外的內容,這個解析可能會搞砸。所以我會很謹慎地指定這樣的最終位置。