为什么我的整个命令行程序需要特定于一个子命令的参数?

时间:2017-06-21 23:26:40

标签: python-2.7 argparse subparsers

我正在使用argparse模块构建一个命令行程序,并且一直在尝试设计两个独立的,互斥的参数组,这些参数组执行完全不同的任务。我决定通过创建subparser来分别使用两组参数,并且我尝试遵循以下链接(https://pymotw.com/2/argparse/)中指定的格式以及许多stackoverflow线程,但每当我尝试运行

中有一个属性错误的脚本与终端中的一个子分析器一起使用。

我的代码按以下方式设置(注意:为了简洁起见,我稍微简化并简化了原始代码中的以下内容):

import argparse

def check_input_file(filename):
    ###validates input file
    return validated_file

if __name__ == "__main__":
    parser = argparse.ArgumentParser(prog= "MyProg")
    parser.description= "This gives an overview of the two different workflows A and B, what they can do, and what arguments they require or can use."   

    A_or_B_subparsers = parser.add_subparsers(help="A processes a certain input to create a .csv spreadsheet, B takes an existing .csv spreadsheet and sends out a certain number to be printed")

    A_parser= A_or_B_subparsers.add_parser("A", help= "A needs the name of an existing input file to make the .csv spreadsheet")

    A_parser.add_argument("-input", required= True, type= check_input_file, help= "validates input file as being suitable for creating the .csv spreadsheet")

    B_parser = A_or_B_subparsers.add_parser("B", help="B will tell the computer to print a certain number of existing spreadsheets in a certain format")

    B_parser.add_argument("-num", type= int, default= 4, help= "number of times to do print existing .csv spreadsheet")

    B_parser.add_argument("-csv", help= "specify the existing .csv spreadsheet that must be formatted and then printed)

    args= MyProg.parse_args()

    if args.A:
        input= open(args.input, 'r')
        ###create .csv spreadsheet of input file in working directory

    if args.B:
        x_number= args.num
        file= args.csv
        ###format existing .csv spreadsheet
        ###print .csv spreadsheet file x_number of times 

现在,如果我尝试在终端中运行此代码,例如,使用以下命令,我会收到以下错误:

$python MyProg_user_interface.py A -input someinputfilename.txt
AttributeError: 'Namespace' object has no attribute 'B'

如何运行命令行程序,以便一次只能运行一个subparser(及其所需的参数)?

更新

找到此源(https://allthingstechilike.blogspot.co.uk/2013/07/python-argparse-example-using-subparser.html)后,我决定在dest= 'mode'的行中设置A_or_B_subparsers = parser.add_subparsers(help="A processes a certain input blah blah blah blah"),以便根据在命令行中是否调用了子命令A或B ,只需要在命令行中输入每个子命令所需的参数。

我随后在行args= MyProg.parse_args()之后修改了我的条件树,看起来像这样:

if args.mode == "A":
    input= open(args.input, 'r')
    ###create .csv spreadsheet of input file in working directory
elif args.mode== "B":
    x_number= args.num
    file= args.csv
    ###format existing .csv spreadsheet
    ###print .csv spreadsheet file x_number of times 
else:
    argparse.ArgumentError("too few arguments")

然而,这种修改似乎并没有修正问题。虽然子命令A可以正常运行,但子命令B拒绝运行。有谁知道这是因为我的代码是如何设置还是因为另一个内部问题?

0 个答案:

没有答案