解析命令行参数的最好方法是什么?
什么是解析Python命令行参数的最简单 , 最 先进 ,最灵活的方法或库?
这个答案建议optparse
适用于较老的Python版本。 对于Python 2.7及更高版本, argparse
替换optparse
。 请参阅此答案以获取更多信息。
正如其他人所指出的那样,您最好通过optopt进行optparse。 getopt几乎是标准getopt(3)C库函数的一对一映射,并且不是很容易使用。
optparse虽然稍微冗长些,但稍后可以更好地进行结构化和简化。
下面是一个典型的向解析器添加选项的行:
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
它几乎说明了一切; 在处理时,它将接受-q或--query作为选项,将参数存储在名为query的属性中,并且如果未指定它,则具有默认值。 它也是自我记录的,因为你在那里用选项声明了帮助参数(在使用-h / - help运行时将使用该参数)。
通常你用以下方法解析你的论点:
options, args = parser.parse_args()
这将在默认情况下解析传递给脚本的标准参数(sys.argv [1:])
options.query将被设置为您传递给脚本的值。
您只需通过执行即可创建解析器
parser = optparse.OptionParser()
这些都是您需要的基础知识。 下面是一个完整的Python脚本,它显示了这一点:
import optparse
parser = optparse.OptionParser()
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
options, args = parser.parse_args()
print 'Query string:', options.query
5行python向你展示基础知识。
将其保存在sample.py中,并使用它运行一次
python sample.py
和一次
python sample.py --query myquery
除此之外,你会发现optparse非常容易扩展。 在我的一个项目中,我创建了一个Command类,它允许您轻松地在命令树中嵌套子命令。 它大量使用optparse来将命令链接在一起。 这不是我可以用几行简单解释的东西,但可以随意在我的存储库中浏览主类,以及使用它的类和选项解析器
其他答案确实提到了argparse
是新Python的出路,但不提供使用示例。 为了完整起见,下面是如何使用argparse的简短摘要:
1)初始化
import argparse
# Instantiate the parser
parser = argparse.ArgumentParser(description='Optional app description')
2)添加参数
# Required positional argument
parser.add_argument('pos_arg', type=int,
help='A required integer positional argument')
# Optional positional argument
parser.add_argument('opt_pos_arg', type=int, nargs='?',
help='An optional integer positional argument')
# Optional argument
parser.add_argument('--opt_arg', type=int,
help='An optional integer argument')
# Switch
parser.add_argument('--switch', action='store_true',
help='A boolean switch')
3)解析
args = parser.parse_args()
4)访问
print("Argument values:")
print(args.pos_arg)
print(args.opt_pos_arg)
print(args.opt_arg)
print(args.switch)
5)检查值
if args.pos_arg > 10:
parser.error("pos_arg cannot be larger than 10")
用法
正确使用:
$ ./app 1 2 --opt_arg 3 --switch
Argument values:
1
2
3
True
不正确的参数:
$ ./app foo 2 --opt_arg 3 --switch
usage: convert [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]
app: error: argument pos_arg: invalid int value: 'foo'
$ ./app 11 2 --opt_arg 3
Argument values:
11
2
3
False
usage: app [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]
convert: error: pos_arg cannot be larger than 10
完整帮助:
$ ./app -h
usage: app [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]
Optional app description
positional arguments:
pos_arg A required integer positional argument
opt_pos_arg An optional integer positional argument
optional arguments:
-h, --help show this help message and exit
--opt_arg OPT_ARG An optional integer argument
--switch A boolean switch
使用docopt
自2012年以来,Python有一个非常简单,强大且非常酷的模块,用于参数解析,称为docopt。 它适用于Python 2.6到3.5,不需要安装(只需复制它)。 这是一个从它的文档中取得的例子:
"""Naval Fate.
Usage:
naval_fate.py ship new <name>...
naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
naval_fate.py ship shoot <x> <y>
naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
naval_fate.py (-h | --help)
naval_fate.py --version
Options:
-h --help Show this screen.
--version Show version.
--speed=<kn> Speed in knots [default: 10].
--moored Moored (anchored) mine.
--drifting Drifting mine.
"""
from docopt import docopt
if __name__ == '__main__':
arguments = docopt(__doc__, version='Naval Fate 2.0')
print(arguments)
所以就是这样:2行代码加上你的doc字符串是必不可少的,你可以在你的arguments对象中解析和解析你的参数。 我告诉你这很酷,不是我;-)
使用python-fire
自2017年以来,python-fire有了另一个很酷的模块,它可以为您的代码提供一个CLI界面,并且可以进行零参数分析。 下面是文档中的一个简单例子(这个小程序向命令行公开了double
函数):
import fire
class Calculator(object):
def double(self, number):
return 2 * number
if __name__ == '__main__':
fire.Fire(Calculator)
在命令行中,您可以运行:
> calculator.py double 10
20
> calculator.py double --number=15
30
真棒不是吗?
链接地址: http://www.djcxy.com/p/30417.html