【问题标题】:Docopt only proceedes when an optional part is given仅当给出可选部分时,Docopt 才会继续
【发布时间】:2017-11-01 19:19:27
【问题描述】:

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

标签: python docopt


【解决方案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]
"""

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

【讨论】:

  • 感谢您的补充。默认选项是一件非常好的事情!
【解决方案2】:

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

"""
\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:”-部分文档字符串。 “选项:”-部分不是。你们中的任何人都可以确认吗?

例如,比较这些变体:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多