我一直在尝试使用docopt来制作一个简单的CLI,但由于某种原因,我的默认参数没有出现。下面是我的测试代码。我正在使用github存储库中的最新版本的docopt.py
。
"""
Usage: scrappy <path> ... [options]
-a --auto Automatically scrape and rename without user interaction.
-l --lang Specify language code [default: en].
--scan-individual Evaluate series information individually for each file.
-c --cfg User alternate config file [default: ../scrappy.conf]
-t --test Test run. Do not modify files.
-v --verbose Print verbose output
"""
from docopt import docopt
arguments = docopt(__doc__, version='0.1.0 alpha')
print arguments # DEBUG
这是我运行$ scrappy/scrappy.py first_path_parameter second/path/parameter
时的输出
{'--auto': None,
'--cfg': None,
'--lang': None,
'--scan-individual': None,
'--test': None,
'--verbose': None,
'<path>': ['first_path_parameter', 'second/path/parameter']}
有人知道发生了什么事吗?
编辑:我更新了我的代码,但我仍然得到类似的输出。更重要的是,当我试图通过--scan-individual
时,我得到一个错误,根据它需要一个参数。同样,如果需要的话,我运行docopt只是简单地将docopt.py复制到项目的工作目录中。这是怎么回事?
#!/usr/bin/env python
"""Scrappy: Rename media files based on scraped information.
Usage: scrappy <path> ... [options]
-a --auto Automatically scrape and rename without user interaction.
-l LANG --lang LANG Specify language code [default: en].
--scan-individual Evaluate series information individually for each file.
-c CONF --cfg CONF User alternate config file [default: ../scrappy.conf]
-t --test Test run. Do not modify files.
-v --verbose Print verbose output
"""
from docopt import docopt
arguments = docopt(__doc__, version='0.1.0 alpha')
print arguments # DEBUG
输出:$ scrappy/scrappy.py first_path_parameter second/path/parameter --scan-individual
--scan-individual requires argument
Usage: scrappy <path> ... [options]
通过查看示例,似乎如果您想传递默认值,则可能必须指定目标变量,例如
naval_fate.py: --speed=<kn> Speed in knots [default: 10].
options_example.py- --exclude=PATTERNS exclude files or directories which match these comma
options_example.py: separated patterns [default: .svn,CVS,.bzr,.hg,.git]
options_example.py- -f NAME --file=NAME when parsing directories, only check filenames matching
options_example.py: these comma separated patterns [default: *.py]
在你的例子中,
-l LANG --lang LANG Specify language code [default: en].
-c CONFIG User alternate config file [default: ../scrappy.conf]
生产
localhost-2:coding $ python doc.py --auto a b c
{'--auto': True,
'--lang': 'en',
'--scan-individual': False,
'--test': False,
'--verbose': False,
'-c': '../scrappy.conf',
'<path>': ['a', 'b', 'c']}
编辑:OP发布的更新代码对我来说很好,我大约半小时前下载了github版本:
localhost-2:coding $ ./scrappy.py first_path_parameter second/path/parameter --scan-individual
{'--auto': False,
'--cfg': '../scrappy.conf',
'--lang': 'en',
'--scan-individual': True,
'--test': False,
'--verbose': False,
'<path>': ['first_path_parameter', 'second/path/parameter']}
我刚刚遇到了同样的问题——我只是在阅读了@DSM和@blz的最后两个评论后才解决了这个问题。
重申一下,为了解析默认变量,您必须确保在选项变量的末尾和选项的文本描述之间至少有两个空格。
From the docs:
用两个空格分隔选项及其非正式描述:
--verbose More text. # BAD, will be treated as if verbose option had
# an argument "More", so use 2 spaces instead
-q Quit. # GOOD
-o FILE Output file. # GOOD
--stdout Use stdout. # GOOD, 2 spaces
因此,如果没有两个空格,选项解析器将描述文本解释为变量而不处理[default: ...]
部分。
我刚刚在自己的代码中遇到了这个问题,并进行了测试(使用hargriffle和DSM的其他答案),直到我发现了以下问题。
注意这是docopt 0.6.1
当运行这个文件时:
#! /usr/bin/env python
"""scans.py
Usage:
scans.py [<args>...]
Options:
-h --help Show this screen.
--version Show version.
-L INT --limit=INT Query response row limit [default: 10]
"""
from docopt import docopt
if __name__ == '__main__':
print docopt(__doc__)
我收到以下输出
{'<args>': []}
但是如果我在用法行中特别注明参数是可选的,就像这样:
Usage:
scans.py [-L INT | --limit=INT] [<args>...]
我收到了我想要的东西:
{'--limit': '10',
'<args>': []}
我也是。
在我的特殊情况下,我注意到doc-opt对以制表符开始的行和以空格开始的行很敏感
#!/usr/bin/env python
"""Sample Application.
Usage:
sample [options] me
sample --version
Options:
--host HOST words here [default: 5]
--version Version identifier
"""
和
#!/usr/bin/env python
"""Sample Application.
Usage:
sample [options] me
sample --version
Options:
--host HOST words here [default: 5]
--version Version identifier
"""
,在Options:列表中的——host和——version之前有一个选项卡。第二种情况不能正确解析默认值,第一个用空格表示初始缩进的情况可以。