2013-08-16 78 views
0

我想使用argparse,但我一直有問題,因爲某些原因,我的位置參數需要先在命令行上。我希望位置是最後的,因爲它是一個文件名列表。Argparse位置參數sequest

self.parser = ArgumentParser(description=program_license, 
        formatter_class=RawDescriptionHelpFormatter, 
        conflict_handler='resolve') 
    self.parser.add_argument('-V', '--version', 
        action='version', 
        version=program_version_message) 
    self.parser.add_argument('--logfile', action='store', 
        dest='logfile', default='daddyvision.log') 
    self.parser.add_argument('prog', help=SUPPRESS, nargs=1) 
    self.parser.add_argument('library', metavar="library", nargs='*') 

    group_loglvl = self.parser.add_mutually_exclusive_group() 
    group_loglvl.add_argument("--verbose", dest="loglevel", 
        action="store_const", const="VERBOSE", 
        default='INFO') 
    group_loglvl.add_argument("--debug", dest="loglevel", 
        action="store_const", const="DEBUG") 
    group_loglvl.add_argument("--trace", dest="loglevel", 
        action="store_const", const="TRACE") 
    group_loglvl.add_argument("--quiet", dest="loglevel", 
        action="store_const", const="WARNING") 
    group_loglvl.add_argument("--errors", dest="loglevel", 
        action="store_const", const="ERROR") 

    args = self.parser.parse_args(arg) 

如果我的命令行是:PGM --error文件名,我得到「錯誤:無法識別的參數:文件名」

如果我的CMD線PGM文件名--error它而不會出現錯誤。

我在做什麼錯。我讀過的所有內容都讓我相信這個位置可以先到後排。 Python 2.7環境。

如果我使位置需要(nargs ='+')它可以工作,但parm是可選的。

+0

您可能會發現這有助於:https://github.com/docopt/docopt – Blender

回答

0

如果您清理它,刪除諸如self之類的東西,則更容易測試您的代碼。我喜歡做import argparse,然後能夠粘貼其餘的,並得到一個運行的例子。

你是如何測試的?

parser.parse_args('pgm --error filename'.split()) 

parser.parse_args('--error filename'.split()) 

parser.parse_args()解析sys.argv[1:]。如果我用這個argparse運行一個名爲pgm的腳本,我期望解析--error filename

幫助,沒有SUPPRESS是:

usage: ipython [-h] [-V] [--logfile LOGFILE] 
       [--verbose | --debug | --trace | --quiet | --errors] 
       prog [library [library ...]] 

positional arguments: 
    prog 
    library 

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

不管如何,關鍵看你的錯誤是usageprog [library [library ...]]部分。

發生了什麼pgm --error filenamepgm字符串設置prog='pgm'library=[]。用*(或?),library滿足於沒有字符串。完成之後,它沒有地方放置filename字符串。

pgm filename --error給出library=['filename']--error pgm filename也應該有效。

問題不是postionals必須是第一個(或最後一個),而是他們必須在一起(如果第二個是'?'或'*')。

這個bug報告後,試圖解釋 '*' positionals和自選

http://bugs.python.org/issue14191#msg185517


的這種相互作用如果pgm是程序名稱sys.argv[0],那麼你不需要它argparse。刪除prog參數,並且問題消失(然後只有一個位置)。

+0

當我通過sys.argv(),沒有pgm條目,我得到sys.argv [0]作爲第一個條目在圖書館清單。 – user1110844

+0

'系統。argv()'給出一個錯誤。如果你想把'sys.argv'傳遞給'parse_args',可以使用'sys.argv [1:]' - 即除'sys.argv [0]'之外的所有內容。 – hpaulj

相關問題