我正在尝试创建一个必需的标志“-f”,它接受Argparse中的输入“filename.pdb”。
这很简单。标准解决方案是添加选项“required = True”。
不幸的是,执行此操作后,“ - f”标志仍显示在帮助列表中的可选参数下。更令人困惑的是,“-f”标志在帮助列表的“使用”提示中显示为必需。
这是我的代码:
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--file_name", required=True, help="enter name of .pdb file")
parser.add_argument("-bw", "--bin_width", default=.25, help="enter desired bin width in nanometers. default = .25")
parser.add_argument("-bn","--base_name", default="IDP", help="custom prefix for output file naming. default = IDP")
args = parser.parse_args()
这是--help
返回的帮助窗口usage: rgcalc.py [-h] -f FILE_NAME [-bw BIN_WIDTH] [-bn BASE_NAME]
optional arguments:
-h, --help show this help message and exit
-f FILE_NAME, --file_name FILE_NAME
enter name of .pdb file
-bw BIN_WIDTH, --bin_width BIN_WIDTH
enter desired bin width in nanometers. default = .25
-bn BASE_NAME, --base_name BASE_NAME
custom prefix for output file naming. default = IDP
正如您在“使用”块中看到的那样,“ - f”已从括号中取出,表示它是必需的。尽管如此,“-f”仍出现在“可选参数”部分。
是否可以:
A)自定义格式化帮助窗口以解决此问题
或
B)添加一些代码使标志“-f”,“ - file_name”显示为位置(与可选对象相反),但仍需要标志?
我读到Argparse故意这样做是为了避免位置标志,但我应该这样做是为了迎合传统的linux用户。
谢谢亲切的互联网!
答案 0 :(得分:10)
此问题已在http://bugs.python.org/issue9694,'argparse required arguments displayed under "optional arguments"'
由于历史实践(在UNIX和Python中)以及缺乏良好的替代方案,这是一个难以解决的术语问题。
带有'-f'
之类“旗帜”的参数历来被称为期权或期权。通常,除非您想要一些与默认值不同的值,否则不要使用它们。但是'argparse'允许你指定required=True
,所以现在你有'必需的可选'。使用nargs='?'
,可以获得不需要的“位置”。
在Python开发人员提出一些替代术语之前,您最好的选择是使用'ArgumentGroup',其中包含您喜欢的标题和描述。默认情况下,解析器有2个ArgumentGroups,'可选参数'和'位置参数'。它必须将论证放在一个或另一个中。您可以创建其他人,并根据需要填充它们。
请参阅http://bugs.python.org/issue9694#msg132327(由原始argparse开发人员发布)。
“用法”行是准确描述参数如何使用以及是否需要参数的行。 'ArgumentGroups'不会影响使用或解析。他们只是确定帮助行的分组方式。
代码:
parser = argparse.ArgumentParser()
req_grp = parser.add_argument_group(title='Required Optional')
req_grp.add_argument("-f", "--file_name", required=True, help="enter name of .pdb file")
parser.add_argument("-bw", "--bin_width", default=.25, help="enter desired bin width in nanometers. default = .25")
parser.add_argument("-bn","--base_name", default="IDP", help="custom prefix for output file naming. default = IDP")
args = parser.parse_args()
"""
usage: stack26227536.py [-h] -f FILE_NAME [-bw BIN_WIDTH] [-bn BASE_NAME]
optional arguments:
-h, --help show this help message and exit
-bw BIN_WIDTH, --bin_width BIN_WIDTH
enter desired bin width in nanometers. default = .25
-bn BASE_NAME, --base_name BASE_NAME
custom prefix for output file naming. default = IDP
Required Optional:
-f FILE_NAME, --file_name FILE_NAME
enter name of .pdb file
"""
将此与通过删除-f
标志产生的帮助进行比较:
usage: stack26227536.py [-h] [-bw BIN_WIDTH] [-bn BASE_NAME] file_name
positional arguments:
file_name enter name of .pdb file
optional arguments:
-h, --help show this help message and exit
-bw BIN_WIDTH, --bin_width BIN_WIDTH
enter desired bin width in nanometers. default = .25
-bn BASE_NAME, --base_name BASE_NAME
custom prefix for output file naming. default = IDP