解析命令行参数的最好方法是什么?

什么是解析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

上一篇: What's the best way to parse command line arguments?

下一篇: line parameters into string[] in C#