1

我正在使用 argparse 模块构建一个命令行程序,并且一直在尝试设计两个独立的、互斥的参数组来执行完全不同的任务。我决定通过创建子解析器来单独使用两组参数,并且我尝试遵循以下链接(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'

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

更新

找到这个来源(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 根本拒绝运行。有谁知道这是因为我的代码是如何设置的还是因为另一个内部问题?

4

0 回答 0