我docopt
在一个示例中使用我正在处理的模块,并且所有选项默认值都在工作,除了一个.我已经修改了包含和围绕该选项的所有代码,试图找出问题,但它不会采用默认值!
我的选项块看起来像这样:
Options:
--help Show this message and exit
--version Show version info and exit
-w WIDTH --width=WIDTH The out to out width of the deck (feet) [default: 73]
-g GIRDERS --girders=GIRDERS The number of girders [default: 8]
-h HEIGHT --height=HEIGHT The height of the girders (inches) [default: 56]
-t THICK --thick=THICK The deck thickness (inches) [default: 8]
-a ADIM --adim=ADIM The "A" dimension, max deck thick @ CL girder [default: 12]
-l LSLP --leftslope=LSLP The left-hand deck …
Run Code Online (Sandbox Code Playgroud) 我必须编写一个命令行界面,我已经看到我可以使用docopt
和argparse
.
我想知道两者之间的主要区别是什么,这样我才能做出明智的选择.
请坚持事实.我不想哇.docopt.如此美丽.很有用.
我想以一种方式设计我的命令行应用程序,让我们称之为注释,可以多次指定,例如,
$ ./my_app.py --comment="Comment 1" --comment="Comment 2"
Run Code Online (Sandbox Code Playgroud)
可以用docopt完成吗?我检查了docopt主页,但找不到对同一可选参数的多个出现的任何引用.
我正在使用我的python应用程序作为命令行工具,功能docopt库.使用该库实现命令很容易.但是,目前我无法找到完成以下要求的方法:
文档字符串是:
"""
aTXT tool
Usage:
aTXT <source>... [--ext <ext>...]
Options:
--ext message
"""
Run Code Online (Sandbox Code Playgroud)
从shell,我想写这样的东西:
atxt a b c --ext e f g
Run Code Online (Sandbox Code Playgroud)
docopt输出的结果字典如下:
{'--ext': True,
'<ext>': [],
'<source>': ['a', 'b', 'c', 'e', 'f']}
Run Code Online (Sandbox Code Playgroud)
但是,我需要具备以下条件:
{'--ext': True,
'<ext>': ['e', 'f', 'g'],
'<source>': ['a', 'b', 'c']}
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
我在我的简单Python程序中使用docopt:
#!/usr/bin/env python
"""
Farmers market
Usage:
farmersmarket.py buy -i <item> -q <quantity> [<quantity>] [-p <price>] [-dvh]
farmersmarket.py -d | --debug
farmersmarket.py -v | --version
farmersmarket.py -h | --help
Options:
-i --item Item.
-q --quantity Quantity.
-p --price Price.
-d --debug Show debug messages.
-h --help Show this screen.
-v --version Show version.
"""
from docopt import docopt
print docopt(__doc__)
Run Code Online (Sandbox Code Playgroud)
如果我跑:
farmersmarket.py buy --item eggs --quantity 100 115 --price 0.25
Run Code Online (Sandbox Code Playgroud)
预期的行为是以0.25的价格在价值100和115之间购买随机数量的蛋.至少在解释参数时,这没有问题.换句话说,docopt可以按预期获得所有内容:
{'--debug': False,
'--help': False,
'--item': …
Run Code Online (Sandbox Code Playgroud) 我正在使用R 的docopt实现.我的脚本有一个命令行选项,其中包含短格式-g
.当我运行我的脚本时,似乎这个参数首先由R解释,然后由我的脚本解释.因此,我得到一个关于不指定GUI值的手腕拍.我可以阻止R尝试使用这些命令行参数吗?
脚本示例:
#!/usr/bin/Rscript
suppressPackageStartupMessages(library(docopt))
"docopt practice script
Usage: foo.R [-g <goodies>]
Options:
-g <goodies>, --goodies=<goodies> Goodies
" -> doc
opts <- docopt(doc)
cat(sprintf("goodies = %s\n", opts$goodies))
Run Code Online (Sandbox Code Playgroud)
这是我运行时发生的事情:
Jennifers-MacBook-Pro-3:scripts jenny$ ./foo.R -g donuts
WARNING: --gui or -g without value ignored
goodies = donuts
Run Code Online (Sandbox Code Playgroud)
如果您更改选项的缩写形式-g
,以-j
中,WARNING
消失了......但我有一个很好的理由使用字母g
!
我一直在尝试使用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
Run Code Online (Sandbox Code Playgroud)
这是我跑步时的输出 $ scrappy/scrappy.py first_path_parameter second/path/parameter
{'--auto': None,
'--cfg': None,
'--lang': None,
'--scan-individual': …
Run Code Online (Sandbox Code Playgroud) 有没有更好的方法来处理此验证:
#!/usr/bin/env python
""" command.
Usage:
command start ID
command finish ID FILE
command (-h | --help)
command (-v | --version)
Arguments:
FILE input file
PATH out directory
Options:
-h --help Show this screen.
-v --version Show version.
"""
from docopt import docopt
from schema import Schema, Use, SchemaError
if __name__ == '__main__':
args = docopt(__doc__, version='command alpha')
# Remove False or None keys from args dict
for k, v in args.items():
if (not v):
args.pop(k)
if 'start' in args: …
Run Code Online (Sandbox Code Playgroud) 我想要一个带有两个参数的选项。即希望能够使用
$ ./foo --path "old" "new"
Run Code Online (Sandbox Code Playgroud)
或者我真正想要的是:
$ ./foo --path "old" "new" --path "old" "new"
Run Code Online (Sandbox Code Playgroud)
但我不知道该怎么办?(事实上我担心这可能是不可能的......)
我知道如何有一个重复选项(见下文),但这实际上不是我想要的。
#!/usr/bin/env python3
'''foo
Usage:
foo [--path ARG]...
Options:
--path=ARG Repeating option.
'''
import docopt
args = docopt.docopt(__doc__)
print(args)
Run Code Online (Sandbox Code Playgroud)
可以调用
$ ./foo --path "old" --path "new"
Run Code Online (Sandbox Code Playgroud) 我想docopt
用于解析可以多次接收相同选项的命令行.有人可以解释一下怎么做吗?
一个测试例子:
#!/usr/bin/env python
"""
Test program.
Usage:
test.py -v
Options:
-v Flag that should be counted
"""
import docopt
print docopt.docopt(__doc__)
Run Code Online (Sandbox Code Playgroud)
如果我用这个test.py -v
,我得到:
{'-v': True}
Run Code Online (Sandbox Code Playgroud)
如果我运行它test.py -vv
,它会显示用法消息(表示命令行无效).
我想调整选项文档,以便docopt
返回给我:
{'-v': 1}
Run Code Online (Sandbox Code Playgroud)
当只有1 -v
通过时:
{'-v': 3}
Run Code Online (Sandbox Code Playgroud)