2017-08-31 88 views
0

所以,我试图建立一个脚本,可以让我运行如下命令:遇到问题打电话给在单独的参数解析函数main()

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()中的参数解析函数时,它无法识别'args',但即使我设置了args=parse_all_args,if语句也存在问题,例如'str' object has no attribute 'automation'

我能做些什么来纠正这些错误以及您预见的其他人?

+2

请添加真实代码,图片无助于任何人 – PRMoureu

+0

“action =”store_true“'也是必需的参数的要点是什么? –

+1

当您执行'return args.language'时,这会将值传递回您调用'parse_language()'的位置,因此如果您不对返回值进行任何操作,则函数不会与每个变量共享变量其他。如果你想设置一个全局变量,把'global args'放在设置它的函数中。 –

回答

0

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

如果parse_language使用args, extras = parser.parse_known_args(),它会寻找-l,并忽略其余。您可能还想删除required,并定义default(两个选项之一)。

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

正如在评论中指出的那样,requiredstore_true没有任何意义。如果你省略-sa它会抱怨;如果包含它,args.automation将是True。所以没有办法得到一个错误。

当您致电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功能使用的。

+0

谢谢!我会尝试 – claudiadast

+0

对于如何创建一个不参与争论的标志,我仍然有点不确定。例如,如果我只是想运行'-python rhize_refactored -b',在这种情况下'-b'不带参数。 'parser.add_argument(.....)'行应该是什么样子的? – claudiadast

+0

'store_true'不带参数;如果缺少结果,如果False,如果存在True。这是'store_const'上的变体。 – hpaulj