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

2024-04-20 12:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

解析Python命令行参数的最简单的方法或库是什么?


Tags: 方法命令行参数
3条回答

这个答案表明optparse适合于较旧的Python版本。对于Python2.7及更高版本,argparse替换optparse。有关详细信息,请参见this answer

正如其他人指出的那样,你最好选择optparse而不是getopt。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非常容易扩展。 在我的一个项目中,我创建了一个命令类,允许您轻松地在命令树中嵌套子命令。它大量使用optparse将命令链接在一起。这不是我能简单地用几行话解释的,但是对于主类和a class that uses it and the option parser可以随意地browse around in my repository

使用docopt

自2012年以来,有一个非常简单、功能强大且非常酷的参数解析模块叫做docopt。以下是从其文档中获取的示例:

"""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接口,同时执行zero参数解析。下面是文档中的一个简单示例(这个小程序将函数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

^{}是一条路。以下是如何使用它的简短摘要:

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

相关问题 更多 >