【问题标题】:Python argparse example?Python argparse 示例?
【发布时间】:2014-01-22 07:16:12
【问题描述】:

我正在尝试学习 argparse 以便在我的程序中使用它,语法应该是这样的:

-a --aLong <String> <String>
-b --bLong <String> <String> <Integer>
-c --cLong <String>
-h --help

我有这个代码:

#!/usr/bin/env python
#coding: utf-8

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Lorem Ipsum')
    parser.add_argument('-a','--aLong', help='Lorem Ipsum', required=False)
    parser.add_argument('-b','--bLong', help='Lorem Ipsum', required=False)
    parser.add_argument('-c','--cLong', help='Lorem Ipsum', required=False)
    parser.add_argument('-h','--help', help='Lorem Ipsum', required=False)
    parser.parse_args()

问题是,我阅读了官方文档,看过 YouTube 视频等,但我无法理解如何确定“主参数”的“子参数”的数量?

示例:myApp.py -b Foobar 9000,如何设置-b 必须有两个“子参数”,以及如何获取值,Foobar9000

还有一个疑问,我知道我可以将参数设置为required,但我想让我的程序仅在至少一个参数被传递时执行,四个参数中的任何一个提到了。

也许这是一个愚蠢的问题,但对不起,我无法理解,希望这里有“教师权力”的人来解释它。

【问题讨论】:

  • 您应该能够使用 Argument Groups - docs.python.org/dev/library/argparse.html#argument-groups 实现您提到的内容。
  • argument-groups 无济于事。它们影响help 显示,但不影响解析。像 FMc 那样在解析后进行测试是确保给出 3 个参数之一的方法。可以使用互斥组来防止使用超过 1 个组,但 OP 想要“至少一个”。

标签: python python-3.x argparse


【解决方案1】:
import argparse

# Use nargs to specify how many arguments an option should take.
ap = argparse.ArgumentParser()
ap.add_argument('-a', nargs=2)
ap.add_argument('-b', nargs=3)
ap.add_argument('-c', nargs=1)

# An illustration of how access the arguments.
opts = ap.parse_args('-a A1 A2 -b B1 B2 B3 -c C1'.split())

print(opts)
print(opts.a)
print(opts.b)
print(opts.c)

# To require that at least one option be supplied (-a, -b, or -c)
# you have to write your own logic. For example:
opts = ap.parse_args([])
if not any([opts.a, opts.b, opts.c]):
    ap.print_usage()
    quit()

print("This won't run.")

【讨论】:

  • OP 有 python-3.x 标签,但这个答案是 Python 2。
  • 还没有:在 Python 3 中 filter 返回一个迭代器,而不是一个列表。你应该改写if not any([opts.a, opts.b, opts.c]):
  • 谢谢,我现在知道了。只是有点怀疑:我试图使用这样的东西:'-a', '--aLong',但如果我这样做,当我打电话给opts.a 时,它会给我一个错误 - AttributeError: 'Namespace' object has no attribute 'a',所以我必须打电话给opts.aLong,为什么?
  • 添加一个dest参数parser.add_argument('-a','--aLong', dest='a' ...)
  • OP 还希望 -b 接受 2 个字符串和 1 个整数。 argparse 无法直接处理。自定义操作可以做到这一点,但这是一个高级主题。
【解决方案2】:

关键是定义一个必需的、互斥的组。

import argparse

# Use nargs to specify how many arguments an option should take.
ap = argparse.ArgumentParser()
group = ap.add_mutually_exclusive_group(required=True)
group.add_argument('-a', nargs=2)
group.add_argument('-b', nargs=3)
group.add_argument('-c', nargs=1)


# Grab the opts from argv
opts = ap.parse_args()

# This line will not be reached if none of a/b/c are specified.
# Usage/help will be printed instead.

print(opts)
print(opts.a)
print(opts.b)
print(opts.c)

【讨论】:

  • 您需要的组意味着这三个组中的一个是必需的。 OP 想要“至少一个”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 2021-06-24
  • 2013-12-14
  • 2016-05-23
  • 1970-01-01
  • 2015-07-26
  • 2017-12-11
相关资源
最近更新 更多