首页 > 解决方案 > Python 'getopt' 语法,允许可选的命令行参数,longopts 无法识别

问题描述

import sys
import getopt

paper = 0

try:
    argv = sys.argv[1:]
except:
    pass

try:
    options = getopt.getopt(argv, 'p', ["paper"])
except:
    pass

for name in options:
    if name in ['p', '-p', '-paper', '--paper']:
        paper = 1    

$ python myApp.py p 或 -p

-- Works properly

$ python myApp.py -paper 或 --paper

-- Traceback (most recent call last):
File "myApp.py", line 52, in <module>
for name in options:
NameError: name 'options' is not defined

嘿,伙计。所以我不确定我做错了什么,我的longopts,“paper”没有被命令行识别。

谢谢你。

尊敬,

滑动3r

标签: pythonargvgetopt

解决方案


您包装这两个语句的try-except那个​​可能会掩盖错误并使其不分配选项。我已经重写了它,所以这些try-except语句都消失了,并修复了一些使用getopt.

您可能应该考虑返回的元组。根据文档(https://docs.python.org/3/library/getopt.html#getopt.getopt):

第一个是 (option, value) 对的列表;第二个是选项列表被剥离后留下的程序参数列表(这是 args 的尾随切片)

最终产品:

import sys
import getopt

argv = sys.argv[1:]
options, args = getopt.getopt(argv, 'p', ["paper"])

for opt_value in options:
    if opt_value[0] in ['-p', '--paper']:
        print('Paper arg set!')

这导致这些输出:

~$ python myApp.py --paper
Paper arg set!
~$ python myApp.py -p
Paper arg set!

切片允许起始索引超过长度:

> myargs = ['myapp.py', 'a', 'b', 'c']
> myargs[5:]
< []

推荐阅读