在main()中调用单独的参数解析函数时遇到问题

时间:2017-08-31 18:48:10

标签: python argparse

所以,我正在尝试开发一个允许我按如下方式运行命令的脚本:

python3 rhize_refactored.py -l <str>, -sa, -si <int>, -i <input_path>, -o <output_path>

我设计了我的脚本,使得参数解析步骤是它们自己的函数,然后我在main()中调用它们。以下是这些部分的内容:

from argparse import ArgumentParser

def parse_all_args():
   parser= ArgumentParser()
   parser.add_argument('-sa', '--automation', action='store_true', required=True)
   parser.add_argument('-si', '--sample_id', type=int, required=True)
   parser.add_argument('-i', '--input_path', required=True)
   parser.add_argument('-o', '--output_path', required=True)
   args= parser.parse_args()
   return args.automation, args.sample_id, args.input_path, args.output_path

def parse_language():
   parser = ArgumentParser(prog= 'rhize_refactored.py')
   parser.add_argument('-l', dest='language', choices ['bash','python'], type=str, required=True) 
   args= parser.parse_args()
   return args.language

def r_bash():
   parse_all_args()
   if args.automation:
      stage_automation_templates()
   sample_id= args.sample_id
   s3_input_path= args.input_path
   s3_output_path= args.output_path`

def main():
   parse_language()   
   if args.language == "python":
      r_python() 
   if args.language == "bash":
      r_bash()
main()

当我尝试运行此脚本时,我遇到了几个问题:

  • 它不允许我一步完成命令。我必须首先运行python3 rhize_refactored.py -l,然后它说我错过了-sa, -si, etc...个参数。但是,当我一次性完成所有论点时,它表示它不会识别过去-l之后的论据。
  • 当我调用main()中的参数解析函数时,它不会识别&#39; args&#39;,但即使我设置args=parse_all_args,它也会出现if语句的问题,例如为'str' object has no attribute 'automation'

我可以做些什么来纠正这些错误以及你预见到的任何其他错误?

1 个答案:

答案 0 :(得分:0)

命令行字符串放在sys.argv中。所有parse_args()命令都读取该列表。你有两个解析器。两者都应该能够处理或忽略你提供的所有可能的字符串。

如果parse_language使用args, extras = parser.parse_known_args(),它会查找-l,而忽略其余部分。您可能还想放弃required,而是定义default(2个选项中的一个)。

parse_all_args也必须处理或忽略-l。您可以再次使用parse_known_args。或者您可以包含-l参数并忽略结果。或者您可以将extrasparse_language传递给parser.parse_args(argv=extras)

正如评论中指出的那样required store_true没有意义。如果省略-sa,它会抱怨;如果您加入args.automationTrue。所以没有办法得到一个假。

当您致电parse_language时,您需要接受返回的值,并对其执行某些操作。其他功能也一样。

def main():
   language = parse_language()   
   if language == "python":
      r_python() 
   if language == "bash":
      r_bash()

我建议改变

def parse_all_args():
   parser= ArgumentParser()
  ...
   args= parser.parse_args()
   return args
def r_bash():
   args = parse_all_args()
   if args.automation:
      stage_automation_templates()
   ....

这些最后的更改只是基本的Python函数使用。