Python: Argparse未解析长文本参数

1 投票
3 回答
1487 浏览
提问于 2025-04-17 16:30

我正在用Python写一个新的命令行工具,使用了cmd和argparse这两个库。当我设置一个参数并用很长的文本选项调用它时,它没有识别出这是文本,结果抛出了一个异常。

这是我使用参数的方式:

WACP:~ cli$ add -t group -n NameForNewGroup -desc 'Description for new group' -c 2

返回的结果是:

unrecognized arguments: - t   g r o u p   - n   N a m e F o r N e w G r o u p   - d e s c   ' D e s c r i p t i o n   f o r   n e w   g r o u p '   - c   2

这是我添加参数的方式:

self.parser.add_argument('-t', '--type',
                                 dest='type',
                                 help=Language.MSG_ADD_TYPE_HELP,
                                 action='store',
                                 default='device'
)
self.parser.add_argument('-c', '--config',
                                 dest='config',
                                 help=Language.MSG_ADD_GROUP_HELP,
                                 action='store',
                                 default=0
)
self.parser.add_argument('-n', '--name',
                                 dest='name',
                                 help=Language.MSG_ADD_NAME_HELP,
                                 action='store',
                                 default='New Device'
)
self.parser.add_argument('-desc', '--description',
                                 dest='description',
                                 help=Language.MSG_ADD_DESC_HELP,
                                 type=complex,
                                 action='store',
                                 default='Default description for device or group included in configuration values')

我查看了argparse的文档,但没有找到如何配置它的方法。

我需要处理这个长文本的解析,并让它正常工作。

有没有人有解决这个问题的想法?

3 个回答

0

你是怎么调用 parse_args 的?从你回复中的空格 - t g r o u p - n N... 看来,可能是你用了 p.parse_args(list('-t group -n N...')),或者类似的方式。这样的话,每个字符都被当作了单独的参数。

或者你可能是用 p.parse_args('-t group -n N ...')。如果是测试的话,正确的调用方式应该像这样 p.parse_args(['-t','group','-n','N', ...])(也就是一个字符串的列表)。

0

通常情况下,长选项需要用两个短横线“--”开头。也许这就是问题所在?我不确定一个短横线“-”是否也可以用。

1

对我来说是可以的。也许你可以提供一个简单的测试案例?你用的是什么版本的Python?你确定你在用argparse而不是optparse吗?你是在正确的对象上调用parse_args()吗?运行-h的输出是什么?

import argparse
p = argparse.ArgumentParser()
p.add_argument('-t', '--type',
               dest='type')
p.add_argument('-c', '--config',
               dest='config')
p.add_argument('-n', '--name',
               dest='name')
p.add_argument('-desc', '--description',
               dest='description')
print(p.parse_args())

运行时:

$ python test.py -t group -n NameForNewGroup -desc 'Description for new group' -c 2
Namespace(config='2', description='Description for new group', name='NameForNewGroup', type='group')
$ python test.py -h
usage: test.py [-h] [-t TYPE] [-c CONFIG] [-n NAME] [-desc DESCRIPTION]

optional arguments:
  -h, --help            show this help message and exit
  -t TYPE, --type TYPE
  -c CONFIG, --config CONFIG
  -n NAME, --name NAME
  -desc DESCRIPTION, --description DESCRIPTION

注意

  1. 通常,如果你有短参数(比如-t)和长参数(比如--type),短参数应该每个只用一个字母。所以-desc就有点奇怪。

  2. 你不需要用type=complexcomplex类型是用来表示复数的,比如1+0.5j

  3. 默认的操作是store,所以你可以省略它。

撰写回答