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

新手上路,请多包涵

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

原文由 kamens 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 690
2 个回答

这个答案建议 optparse 这适用于较旧的 Python 版本。对于 Python 2.7 及更高版本, argparse 替换 optparse 。有关更多信息,请参阅 此答案

正如其他人指出的那样,您最好使用 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 非常容易扩展。在我的一个项目中,我创建了一个 Command 类,它允许您轻松地将子命令嵌套在命令树中。它大量使用 optparse 将命令链接在一起。这不是我可以用几行轻松解释的东西,但请随意 在我的存储库中浏览 主类,以及 使用它的类和选项解析器

原文由 Thomas Vander Stichele 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Andrzej Pronobis 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题