繁体   English   中英

参数的顺序在getopt中很重要

[英]Order of the arguments matters in getopt

我的应用程序解析命令行参数:

import sys
import getopt

arguments = sys.argv[1:]
options, remainder = getopt.getopt(arguments, "aa:bb:cc:dd:h", ["aaaa=", "bbbb=", "cccc=", "dddd=", "help"])

print dict(options)

这很好用,但同时又很奇怪:如果我按不同顺序放置参数,则不会解析它们

python my_app.py --aaaa=value1 --bbbb=value2 --cccc=value3 --dddd=value4 #ok
python my_app.py --dddd=value4 --bbbb=value2 --cccc=value3 --aaaa=value1 # empty

这令人失望,因为参数的顺序无关紧要,应该吗? 有什么办法解决吗?

更新:

python my_app.py -aa value1 # odd, empty { "-a" : "" } 
python my_app.py -a value1 # even this empty { "-a" : "" }

如对问题的第一条评论所述,关于以不同顺序对参数进行失败解析的主要示例运行良好:

~/tmp/so$ python my_app.py --aaaa=value1 --bbbb=value2 --cccc=value3 --dddd=value4
{'--aaaa': 'value1', '--cccc': 'value3', '--dddd': 'value4', '--bbbb': 'value2'}
~/tmp/so$ python my_app.py --dddd=value4 --bbbb=value2 --cccc=value3 --aaaa=value1
{'--cccc': 'value3', '--bbbb': 'value2', '--aaaa': 'value1', '--dddd': 'value4'}

如果您不是这种情况,请更新脚本以打印其余部分,并显示其输出。

但是,您仍然滥用getopt库,这就是您提供的最新示例无法按预期工作的原因。 您不能指定一个以上的字符作为选项,因为第二个字符将被视为一个新的单独选项。 getopt无法区分两个连续的字符,这些字符算作一个选项(第一个不带参数值,因为后面没有冒号)或一个由两个字符组成的选项。 getopt.getopt的文档中 ,我特别强调:

options是脚本要识别的选项字母的字符串,选项需要一个参数,后跟一个冒号。

因此,当getopt解析您的参数时,每次遇到-a参数时,它将它与它注意到的第a选项相关联,在您的情况下,该选项后没有冒号。 因此,它设置了该选项,如果有的话(如果-aa作为脚本的参数传递,则第二个a计为参数值),则放弃其参数值,然后移至下一个参数。

最后,关于getoptargparse 该文档明确提倡argparse

getopt模块是命令行选项的解析器,其API设计为C getopt()函数的用户熟悉。 不熟悉C getopt()函数或希望编写更少代码并获得更好帮助和错误消息的用户,应考虑改用argparse模块。

有关为何argparse优于getopt和已弃用的optparse可以在本PEP该问题的答案中阅读。
我发现在argparse需要一些工作的同时, getopt支持的唯一功能是参数顺序排列,例如gnu getopt 但是, 此问题说明了如何通过argparse实现此目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM