[英]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
且它是最后一個參數時,您的特殊操作才有效。
另一種選擇是使“組件”成為子解析器的位置。 默認情況下,需要位置。 可以將path
和delete
添加到需要它們的那些子解析器中。
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.