蟒蛇 2.7。解析输入参数

Posted

技术标签:

【中文标题】蟒蛇 2.7。解析输入参数【英文标题】:Python 2.7. Parse input parameters 【发布时间】:2020-06-05 05:46:54 【问题描述】:

一天的好时光!首先,让我说我是 Python 世界的新手。我在解析输入参数时遇到问题。目前我正在使用 Python 2.7 和名为 argparse 的模块。我正在尝试设计能够解析简单输入参数的简单应用程序。这是一个简短的例子:

my_app.py 同步 --force

第二个例子:

my_app.py 补丁 --branch

我看到为此我可以使用add_argument,它可以使用位置参数和可选参数。就像我的情况一样,我希望很少有位置参数(但同时是可选的)和几个可选参数。 为此,我设计了小脚本

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='My App')
    parser.add_argument('sync', type=bool, const=True, nargs='?')
    parser.add_argument('-f', '--force', dest='sync_force', type=bool, const=True, nargs='?')
    parser.add_argument('-b', '--branch', type=str, const=True, nargs='?')
    parser.add_argument('-u', '--url', type=str, const=True, nargs='?')
    parser.add_argument('patch', type=bool, const=True, nargs='?')
    parser.add_argument('revert', type=bool, const=True, nargs='?')
    parser.add_argument('verify', type=bool, const=True, nargs='?')

    values = parser.parse_args()

    if values.revert:
        handler.revert()
    else:
        parser.print_help()

我看到我可以使用nargs='?' 将位置参数指定为可选,但是每次我调用我的脚本时,它都会显示我将'sync' 作为输入参数,甚至如果我指定了“补丁”。所以,我认为它只显示了第一个添加的元素。 你能告诉我哪里出了问题,哪里出了问题?

更新: 我正在尝试实现一种情况,即我将能够同时只有一个位置参数(并且至少有一个,但带有任何其他可选参数)。例如

my_app.py 同步

my_app.py 路径

my_app.py 验证 --force

my_app.pyrevert --branch

【问题讨论】:

我使用的是 Python 2.7 为什么? 你能提供更多关于参数使用选项的信息吗?例如,是否应该同时出现syncpatchrevertverify 之一?尝试给出你的程序接受的所有不同选项。因为听起来您应该使用互斥组或子命令。很难推荐哪一个没有更多细节 patch/revert/verify替换为add_argument('cmd',choices=['patch', 'revert', 'verify']),解析后检查values.cmd type=bool 是错误的。如果您想要真/假值,请使用action='store_truenargs='?' 有它的用途,但我认为它在任何这些用途中都没有用。 const 也一样。练习最简单的默认storestore_true 操作。 除非您目前被雇用来维护 Python 2 代码,否则您应该切换到 Python 3。 【参考方案1】:

与:

import argparse

if __name__ == '__main__':

    parser = argparse.ArgumentParser(description='My App')
    parser.add_argument('cmd', choices=['sync','patch', 'revert','verify'])
    parser.add_argument('-f', '--force', action='store_true')
    parser.add_argument('-b', '--branch')
    parser.add_argument('-u', '--url')

    args = parser.parse_args()
    print(args)
    if args.cmd in ['revert']:
        print('handler.revert()')
    else:
        parser.print_help()

测试

1243:~/mypy$ python stack60327766.py 
usage: stack60327766.py [-h] [-f] [-b BRANCH] [-u URL]
                        sync,patch,revert,verify
stack60327766.py: error: too few arguments
1244:~/mypy$ python stack60327766.py revert
Namespace(branch=None, cmd='revert', force=False, url=None)
handler.revert()
1244:~/mypy$ python stack60327766.py revert -f -b foobar -u aurl
Namespace(branch='foobar', cmd='revert', force=True, url='aurl')
handler.revert()
1244:~/mypy$ python stack60327766.py verify-f -b foobar -u aurl
usage: stack60327766.py [-h] [-f] [-b BRANCH] [-u URL]
                        sync,patch,revert,verify
stack60327766.py: error: argument cmd: invalid choice: 'verify-f' (choose from 'sync', 'patch', 'revert', 'verify')
1245:~/mypy$ python stack60327766.py verify -f -b foobar -u aurl
Namespace(branch='foobar', cmd='verify', force=True, url='aurl')
usage: stack60327766.py [-h] [-f] [-b BRANCH] [-u URL]
                        sync,patch,revert,verify

My App

positional arguments:
  sync,patch,revert,verify

optional arguments:
  -h, --help            show this help message and exit
  -f, --force
  -b BRANCH, --branch BRANCH
  -u URL, --url URL

【讨论】:

太棒了!但是没有“cmd”参数也可以这样做吗? 没有“cmd”参数怎么办?你不喜欢这个名字?或者不想要一个接受像“revert”这样的词的位置?我展示的内容与@AKX 推荐的子命令相差了一步。 "cmd" 是您想要的一个位置参数。【参考方案2】:

argparse 拥有native support for subcommands。

改编自上述链接的文档,

parser = argparse.ArgumentParser()
parser.add_argument('--foo')
subparsers = parser.add_subparsers()
sync_parser = subparsers.add_parser('sync')
patch_parser = subparsers.add_parser('patch')
revert_parser = subparsers.add_parser('revert')
verify_parser = subparsers.add_parser('verify')

等等。可能就是你要找的。​​p>

除此之外,我只能推荐 Click 库以获得更流畅的 CLI 界面。

【讨论】:

差不多,但总的来说,它不适用于整体逻辑。主要是需要将--foo指定为第一个参数,然后才允许放置子解析器。像“-f sync”而不是“sync -f”

以上是关于蟒蛇 2.7。解析输入参数的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个函数会返回一个值呢? (蟒蛇2.7)

python 2.7的输入重定向

python 蟒蛇参数解析

蟒蛇口口声声说“输入是不确定的。我该如何解决?

输入数据行作为python中的参数

IEEE-754 蟒蛇