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