Python:在组合位置参数和可选参数时,argparse抛出值错误

18

我正在尝试使用Python中的argparse库来读取可选和必需的参数。到目前为止,我的做法是:

import argparse
parser = argparse.ArgumentParser(description='Cleanup Script for Folder')

parser.add_argument('PATH_TO_WORKDIR_ROOT',
                    type=str,
                    dest='PATH_TO_WORKDIR_ROOT',
                    action='store',
                    help='(absolute or) relative path to directory \n   to work on, e.g. "..\MyFolder\\"')
parser.add_argument('--PATH_TO_BACKUP_ROOT',
                    type=str,
                    dest='PATH_TO_BACKUP_ROOT',
                    action='store',
                    help='(absolute or) relative path to Backup-Directory \n   default is ".\BACKUP\"')

args = parser.parse_args()

现在我正在测试我的代码,但它给了我一个我不理解的值错误:

$ python argparsetest.py --help
Traceback (most recent call last):  
File "argparsetest.py", line 5, in <module>
    parser.add_argument('PATH_TO_WORKDIR_ROOT', type=str, dest='PATH_TO_WORKDIR_ ROOT', action='store', help='(absolute or)
relative path to directory \n   to wo rk on, e.g. "..\MyFolder\\"')  
File "C:\Program
Files\Enthought\Canopy\App\appdata\canopy-1.3.0.1715.win-x86_
64\lib\argparse.py", line 1262, in add_argument
    raise ValueError('dest supplied twice for positional argument') ValueError: dest supplied twice for positional argument

只有一个位置参数,目的地不同。我真的不太明白这个麻烦在哪里。


3
请尝试在 PATH_TO_WORKDIR_ROOT 前面加上 --,变成 --PATH_TO_WORKDIR_ROOT。该操作不会改变原意,只是提供了一个指令的具体使用方式。 - Siva Cn
5
错误完全存在于第一个add_argument方法中。第一个字符串是“dest”,你不允许使用关键字参数重新定义它。https://docs.python.org/3/library/argparse.html#dest - hpaulj
2个回答

26
请看以下代码,位于argparse.py中:

# =======================
# Adding argument actions
# =======================
def add_argument(self, *args, **kwargs):
    """
    add_argument(dest, ..., name=value, ...)
    add_argument(option_string, option_string, ..., name=value, ...)
    """

    # if no positional args are supplied or only one is supplied and
    # it doesn't look like an option string, parse a positional
    # argument
    chars = self.prefix_chars
    if not args or len(args) == 1 and args[0][0] not in chars:
        if args and 'dest' in kwargs:
            raise ValueError('dest supplied twice for positional argument')
        kwargs = self._get_positional_kwargs(*args, **kwargs)

由于您没有在 PATH_TO_WORKDIR_ROOT 前加上 --,因此它认为第一个参数是 dest,因此当您再次以命名参数形式提供 dest 时,会引发错误。


2
谢谢你的回答,帮了我大忙! - Mischa Obrecht

1
parser.add_argument('PATH_TO_WORKDIR_ROOT',
                type=str,
                action='store',
                help='(absolute or) relative path to directory \n   to work on, e.g. "..\MyFolder\\"')

从第一个 add_argument 调用中删除 dest


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接