簡體   English   中英

使用ArgParse解析python的參數

[英]Argument parsing python using ArgParse

我正在創建一個python腳本,並且需要解析參數:腳本將接受三個參數,只有一個始終是強制性的,第二個將僅是強制性的,具體取決於第一個和第三個的某些值。沒有出現。 這是我的嘗試:

class pathAction(argparse.Action):
folder = {'remote':'/path1', 'projects':'/path2'}
def __call__(self, parser, args, values, option = None):
    args.path = values
    print "ferw %s " % args.component
    if args.component=='hos' or args.component=='hcr':
        print "rte %s" % args.path
        if args.path and pathAction.folder.get(args.path):
            args.path = pathAction.folder[args.path]
        else:
            parser.error("You must enter the folder you want to clean: available choices[remote, projects]")   

def main():
try:
    # Arguments parsing
    parser = argparse.ArgumentParser(description="""This script will clean the old component files.""")
    parser.add_argument("-c", "--component",  help="component to clean",  type=lowerit, choices=["hos", "hcr", "mdw", "gui"], required=True)
    parser.add_argument("-p", "--path",       help="path to clean", action = pathAction, choices = ["remote", "projects"])
    parser.add_argument("-d", "--delete",     help="parameter for deleting the files from the filesystem", nargs='*', default=True)


    args = parser.parse_args()  

如果除一種情況下工作正常:如果我有-c,則應該投訴,因為沒有-p,但是沒有,您能幫我嗎? 謝謝

您可以添加一些自定義驗證,如下所示:

if args.component and not args.path:
    parser.error('Your error message!')

僅當存在-p參數時,才會使用您的特殊action 如果只給它-c ,則從不使用交叉檢查。

通常,檢查parse_args之后的parse_args (如Gohn67建議的)比使用自定義操作更可靠,更簡單。

如果您的命令行是'-p remote -c ...'會發生什么? 將在解析和設置-c值之前調用pathAction 那是你要的嗎? 僅當給出-p且它是最后一個參數時,您的特殊操作才有效。


另一種選擇是使“組件”成為子解析器的位置。 默認情況下,需要位置。 可以將pathdelete添加到需要它們的那些子解析器中。

import argparse
parser = argparse.ArgumentParser(description="""This script will clean the old component files.""")
p1 = argparse.ArgumentParser(add_help=False)
p1.add_argument("path", help="path to clean", choices = ["remote", "projects"])
p2 = argparse.ArgumentParser(add_help=False)
p2.add_argument("-d", "--delete", help="parameter for deleting the files from the filesystem", nargs='*', default=True)
sp = parser.add_subparsers(dest='component',description="component to clean")
sp.add_parser('hos', parents=[p1,p2])
sp.add_parser('hcr', parents=[p1,p2])
sp.add_parser('mdw', parents=[p2])
sp.add_parser('gui', parents=[p2])
print parser.parse_args()

樣品使用:

1848:~/mypy$ python2.7 stack21625446.py hos remote -d 1 2 3
Namespace(component='hos', delete=['1', '2', '3'], path='remote')

我使用parents簡化了向多個子解析器添加參數的過程。 我將path定位,因為這是必需的(對於2個子解析器)。 在這種情況下,-- --path只會使用戶鍵入更多內容。 隨着nargs='*'--delete有屬於subparsers所以它可以發生最后一次。 如果nargs是固定的( None或number),則可能是parser的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM