Docopt仅在给出可选部分时进行

时间:2017-09-06 21:53:06

标签: python docopt

我正在尝试学习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)

看来,我误解了一些事情。谁能给我一个提示,我做错了什么?

由于

2 个答案:

答案 0 :(得分:1)

您提供的示例适用于此处。所以它与你正在使用的docopt版本有关。关于符号,你几乎走在正确的轨道上,只缺少一些细节。

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

以下是一个例子:

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

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

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

答案 1 :(得分:1)

我得到了它的工作。最后问题是我使用制表符格式化我的用法文档字符串:

"""
\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

编辑:从功能的角度来看,当没有使用选项卡时,会正确解析参数。但是如果调用错误,则仅打印"用法:" - 文档字符串的部分。 "选项:" -Part不是。你们中的任何人都可以证实吗?

例如,比较这些变体:

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)