需求审查
- 使用
argparse
(我会忽略这一点)
- 允许调用一两个动作(至少需要一个)。
- 尝试通过Pythonic(我宁愿称其为“ POSIX”样)
使用命令行时,还存在一些隐式要求:
- 以易于理解的方式向用户解释用法
- 选项应该是可选的
- 允许指定标志和选项
- 允许与其他参数(例如文件名或文件名)组合。
使用docopt
(file managelog.py
)的示例解决方案:
"""Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
尝试运行它:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
显示帮助:
$ python managelog.py -h
Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> P managelog.py [options] upload -- <logfile>...
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
并使用它:
$ python managelog.py -V -U user -P secret upload -- alfa.log beta.log
{'--': True,
'--pswd': 'secret',
'--user': 'user',
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': False,
'upload': True}
简短的选择 short.py
甚至可以有更短的变体:
"""Manage logfiles
Usage:
short.py [options] (process|upload)... -- <logfile>...
short.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
用法如下所示:
$ python short.py -V process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 1,
'upload': 1}
请注意,不是“ process”和“ upload”键的布尔值,而是计数器。
事实证明,我们不能阻止这些词的重复:
$ python short.py -V process process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 2,
'upload': 1}
结论
设计良好的命令行界面有时可能会充满挑战。
基于命令行的程序有多个方面:
argparse
提供了很多,但是限制了可能的方案,并且可能变得非常复杂。
随着docopt
事情要短得多,同时保留可读性,并提供高度的灵活性。如果您设法从字典中获取解析的参数,并手动(或通过其他名为的库schema
)进行一些转换(转换为整数,打开文件.. ),则可能会docopt
非常适合命令行解析。
-x
通常是一个标志并且是可选的。-
如果需要,请剪切。