我正在尝试学习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)
看来,我误解了一些事情。谁能给我一个提示,我做错了什么?
由于
答案 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)