蟒蛇 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 为什么? 你能提供更多关于参数使用选项的信息吗?例如,是否应该同时出现sync
、patch
、revert
、verify
之一?尝试给出你的程序接受的所有不同选项。因为听起来您应该使用互斥组或子命令。很难推荐哪一个没有更多细节
将patch/revert/verify
替换为add_argument('cmd',choices=['patch', 'revert', 'verify'])
,解析后检查values.cmd
。
type=bool
是错误的。如果您想要真/假值,请使用action='store_true
。 nargs='?'
有它的用途,但我认为它在任何这些用途中都没有用。 const
也一样。练习最简单的默认store
和store_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。解析输入参数的主要内容,如果未能解决你的问题,请参考以下文章