通过ArgumentParser传递额外的参数

时间:2017-09-05 20:33:28

标签: python argparse

所以我有一个脚本,其中我的参数解析函数被分开以获得更清晰的设计。最后,我希望运行一个命令,并让这三个函数解析所有参数。该命令看起来像:

python3 rhize_refactored.py -l <str>, -sa, [-cr], -si <int>, -i <input_path>, -o <output_path>, [-r], [-c]

为了识别所有参数,我设置了脚本,以便第一个参数解析函数忽略的任何额外参数传递给第二个参数解析函数,并再次使用第三个参数解析功能。那部分看起来像这样:

#Argument parsing functions#
def parse_args_language():
   parser=ArgumentParser(prog= 'rhize.py')
   parser.add_argument('-l', dest='language', choices= ['bash', 'python'], type=str, default='bash') #required

   args, extras1= parser.parse_known_args() #pass extras down to parse_args_bash()
   return args
   return extras1

def parse_args_bash(extras1):
   parser=ArgumentParser()
   parser=parser.add_argument('-sa', action='store_true') #required
   parser=parser.add_argument('-cr', action='store_true') #optional
   parser=parser.add_argument('-si', type=int) #required
   parser=parser.add_argument('-i') #required
   parser=parser.add_argument('-o') #required

   args=parser.parse_args(argv =extras1)
   extras2= parser.parse_known_args() #pass extras down to parse_args_repo
   return args
   return extras2

def parse_args_repo(extras2):
   parser= ArgumentParser()
   parser.add_argument('-r', action= 'store_true') #optional
   parser.add_argument('-c', action= 'store_true') #optional

   args=parser.parser_args(argv=extras2)
   return args

   ##############################################################

def rhize_bash():
   args, extras1= parse_args_language()
   parse_args_bash(extras1)
   make_templates() 
   ....

def make_templates():
   args, extras2= parse_args_bash()
   parse_args_repo(extras2)
   ...

def main():
   language= parse_args_language()
   if language == "bash":
       rhize_bash()
   if language == "python":
       rhize_python() #omitted from this post

   print("Completed the run.")
main()

我是否以正确的方式设置了它?因为当我尝试运行完整的脚本时,它似乎完全贯穿它,即使我知道它不应该。

1 个答案:

答案 0 :(得分:0)

这是尝试使代码正确流动。我还没有测试过。

#Argument parsing functions#
def parse_args_language():
   parser=ArgumentParser(prog= 'rhize.py')
   parser.add_argument('-l', dest='language', choices= ['bash', 'python'], default='bash')

   args, extras1 = parser.parse_known_args() #pass extras down to parse_args_bash()
   return args, extras1   # return a tuple of items


def parse_args_bash(extras1):
   parser=ArgumentParser()
   parser=parser.add_argument('--sa', action='store_true') 
   # store_true actions are always optional
   parser=parser.add_argument('--cr', action='store_true')
   parser=parser.add_argument('--si', type=int) 
   parser=parser.add_argument('-i') 
   parser=parser.add_argument('-o') 

   args, extras2= parser.parse_known_args() #pass extras down to parse_args_repo
   return args, extras2


def parse_args_repo(extras2):
   parser= ArgumentParser()
   parser.add_argument('-r', action= 'store_true') 
   parser.add_argument('-c', action= 'store_true') 

   args=parser.parser_args(argv=extras2)
   return args

   ##############################################################

def rhize_bash(extras1):
   args1, extras2 = parse_args_bash(extras1)
   make_templates(extras2) 
   ....

def make_templates(extras2):
   args2 = parse_args_repo(extras2)
   ...

def main():
   args, extras1 = parse_args_language()
   if args.language == "bash":
       rhize_bash(extras1)
   elif args.language == "python":
       rhize_python(extras1) #omitted from this post

   print("Completed the run.")

if __name__ == "__main__":
    main()

parse_args_bashparse_args_repo返回单独的args命名空间对象。我们可以将args传递给parse_args_repo,并将其值添加到其中。但我暂时不会跳过这一步。

您的代码多次调用parse_args_language,一次获取args.language值,一次调用extras1。这样做没有坏处,但重新编写它只是被调用一次。

由于它使用的是parse_known_argsparse_args_bash应该使用默认的sys.argv,因为它只会忽略-l参数。但是也可以使用extras来解决这个问题。