我正在尝试使用Python中的argparse
模块编写命令行界面,但是我的一个参数的帮助消息遇到了麻烦。参数应该采用1个参数(文件名)或3个参数(文件名,列,列),所以这就是我接近它的方式:
parser = argparse.ArgumentParser()
parser.add_argument('--score', nargs ='+', help='score file, default X Y = 2 4',
metavar='FILENAME X Y')
args = parser.parse_args()
然后是if-else:
if len(args.score) == 1:
data = open(args.score[0])
S1 = 1
S2 = 3
elif len(args.score) == 3:
data = open(args.score[0])
S1 = int(args.score[1]) - 1
S2 = int(args.score[2]) - 1
else:
print('Error: --score incorrect number of arguments called')
但我的帮助信息如下:
-h, --help show this help message and exit
--score FILENAME X Y [FILENAME X Y ...]
score file, default X Y = 2 4
我希望括号中的部分消失:
-h, --help show this help message and exit
--score FILENAME X Y score file, default X Y = 2 4
修改
以下是我选择使用ANSI转义码来实现修复的方法,尽管这是一个hacky变通方法:
parser.add_argument('--score', nargs ='+', help='\x1b[A\b\b\b\b\b\b X Y \x1b[1C\b score file, default X Y = 2 4',
metavar=('FILENAME', ''))
给出输出
usage: test.py [-h] [--score FILENAME [...]]
optional arguments:
-h, --help show this help message and exit
--score FILENAME X Y score file, default X Y = 2 4
感谢@hpaulj的metavar元组想法。
答案 0 :(得分:0)
在命令行界面的世界里,你所做的是非常不标准的。你应该重新设计你的参数语法。而不是支持这两个:
--score FILENAME
--score FILENAME X Y
您应该考虑其中一种选择:
--score FILENAME [-x X] [-y Y]
--score FILENAME[=X,Y]
使用标准命令行参数解析库很容易支持这两种方法。
答案 1 :(得分:0)
没有metavar
帮助就是:
usage: ipython3 [-h] [--score SCORE [SCORE ...]]
optional arguments:
-h, --help show this help message and exit
--score SCORE [SCORE ...]
score file, default X Y = 2 4
SCORE
源自长名称和'%s [%s ...]' % get_metavar(2)
格式。
如果我将metavar更改为2个元组的元组,它们会替换SCORE
usage: ipython3 [-h] [--score NAME [XY ...]]
optional arguments:
-h, --help show this help message and exit
--score NAME [XY ...]
score file, default X Y = 2 4
使用nargs = 3,我可以在metavar中给出这些单词并获得:
usage: ipython3 [-h] [--score NAME X Y]
....
将该输入拆分为2个参数给出
In [774]: parser.add_argument('--FILENAME', help='score file', metavar='NAME');
In [775]: parser.add_argument('--XY', nargs=2, help='x,y'); # type=int
In [776]: parser.print_help()
usage: ipython3 [-h] [--FILENAME NAME] [--XY XY XY]
optional arguments:
-h, --help show this help message and exit
--FILENAME NAME score file
--XY XY XY x,y
=================
实际格式由HelpFormatter._format_args
方法生成:
def _format_args(self, action, default_metavar):
get_metavar = self._metavar_formatter(action, default_metavar)
....
elif action.nargs == ONE_OR_MORE:
result = '%s [%s ...]' % get_metavar(2)
...