Docopt 只有在给出可选部分时才会继续

Docopt only proceedes when an optional part is given

我正在尝试学习 pythons docopt 模块并有以下简单脚本:

""" Usage:
rsnapshot-once [-c CFGFILE] (sync|hourly|daily|monthly)

    -c CFGFILE  specify the configfile that rsnapshot should use
"""

import logging
import sys

from docopt import docopt

args = docopt(__doc__, version='0.0.1-alpha')

logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, formatter=logging.BASIC_FORMAT)
logging.debug("Parsed arguments:\n" + str(args));

if not args.get("-c"):
    args['CFGFILE'] = "/etc/rsnapshot.conf"

使用 -c 选项从命令行调用时:

% ./rsnapshot-once.py -c someconfigfile sync                                                                
DEBUG:root:Parsed arguments:
{'-c': True,
 'CFGFILE': 'someconfigfile',
 'daily': False,
 'hourly': False,
 'monthly': False,
 'sync': True}

仅传递命令时:

% ./rsnapshot-once.py daily                                                                               
Usage:
        rsnapshot-once [-c CFGFILE] (sync|hourly|daily|monthly)

看来,我是不是误会了什么。谁能给我一个提示,我做错了什么?

谢谢

你给出的例子在这里有效。所以它可能与您使用的 docopt 版本有关。关于符号你几乎在正确的轨道上,只是缺少一些小细节。

在选项之前,应该有一行 "Options:"。 Docopt 寻找这个,并解释后面的行。在选项部分也可以设置选项的默认值。

这是一个例子:

"""Usage:
  rsnapshot-once [-c CFGFILE] (sync|hourly|daily|monthly)

Options:
  -c CFGFILE  specify the configfile that rsnapshot should use 
              [default: /etc/rsnapshot.conf]
"""

然后用户也会看到默认值是什么。

我成功了。最后的问题是我使用制表符来格式化我的使用文档字符串:

"""
\t\t\tUsage:
\t\t\trsnapshot-once [-c CFGFILE] (sync|hourly|daily|monthly)

\t\t\tOptions:
\t\t\t-c CFGFILE        specify the configfile that rsnapshot should use
"""

当我将其更改为:

"""
            Usage:
            rsnapshot-once [-c CFGFILE] (sync|hourly|daily|monthly)

            Options:
            -c CFGFILE      specify the configfile that rsnapshot should use
"""

它工作正常...

在弄清楚问题出在哪里后,我发现了一个类似的问题:https://github.com/docopt/docopt/issues/368

编辑:从功能的角度来看,当不使用制表符时,参数被正确解析。但如果调用错误,则只打印文档字符串的 "Usage:" 部分。 "Options:"-部分不是。你们中的任何人都可以确认吗?

例如,比较这些变体:

1a。 Valid call

1b。 Invalid call(option part is not printed)

2a。 Valid call (but not working)

2b。 Invalid call (Text is printed as expected)