5

我一直在尝试使用 docopt 制作一个简单的 CLI,但由于某种原因,我的默认参数没有出现。下面是我的测试代码。我正在使用docopt.py来自 github 存储库的最新版本。

"""
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]
4

4 回答 4

5

通过查看示例,似乎如果您想传递一个默认值,您可能必须指定一个目标变量,例如

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']}

所以我很茫然。

于 2012-12-21T18:47:17.050 回答
3

我只是在我自己的代码中遇到了这个问题并进行了测试(使用 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>': []}
于 2013-12-27T19:50:34.477 回答
2

我刚刚遇到了同样的问题——我只是在阅读了@DSM 和@blz 的最后两条评论后才解决了这个问题。

重申一下,因为它可能对其他人有所帮助,所以要解析默认变量,您必须确保选项的变量末尾和选项的文本描述之间 至少有两个空格。

文档

使用两个空格分隔选项及其非正式描述:

--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: ...]部分。

于 2013-11-29T10:29:04.910 回答
1

我也有同样的问题。

在我的特殊情况下,我注意到 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 之前有一个选项卡。第二种情况没有正确解析默认值,第一种情况下初始缩进有空格。

于 2014-04-03T03:39:40.140 回答