Python';getopt';语法,允许可选的命令行参数,无法识别longopts

Python';getopt';语法,允许可选的命令行参数,无法识别longopts,python,argv,getopt,Python,Argv,Getopt,$python myApp.py p或-p 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', '--

$python myApp.py p或-p

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-纸张或--paper

-- Works properly
--回溯(最近一次呼叫最后一次):
文件“myApp.py”,第52行,在
对于选项中的名称:
名称错误:未定义名称“选项”

嘿,伙计们。因此,我不确定我做错了什么,因为命令行无法识别我的longopts“paper”

多谢各位

恭敬地


slide3r

包装这两条语句的
try except
可能会掩盖错误,使其无法分配选项。我已经重写了它,这样那些
try-except
语句就不存在了,并且用
getopt
修复了一些用法

您可能应该解释返回的元组。根据文档():

第一个是(选项、值)对的列表;第二个是剥离选项列表后留下的程序参数列表(这是参数的后续部分)

最终产品:

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

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:]
< []

您知道,如果您没有接受
getopt.getopt
中的所有异常,Python将为您提供一条方便的消息,告诉您出错的原因。谢谢!但是[-p--paper]选项不是用来捕获任何值的,它是一个布尔值。因此:和=在定义中是不正确的,这也是我忽略“args”值捕获的原因。如果用户没有输入命令行参数,“argv=sys.argv[1:]”会抛出一个错误,这是错误的吗?编辑:是的,我想错了。删除了错误处理。但长选项仍然无法识别。我当时误解了,我将修改我的答案。至于抛出一个错误,slice语法是可以原谅的,因为如果你试图在iterable的末尾进行切片,它不会抛出,它只会返回一个空数组。我不确定,这里是我运行它并测试它的地方:看看你是否能发现它与你的实现之间的任何差异?你能修改屏幕截图以包括上面你调用它的那一行吗?啊,现在有意义了!长参数需要与
-
一起使用,短参数需要与
-
一起使用。它应该使用
-p
-纸张
运行。
> myargs = ['myapp.py', 'a', 'b', 'c']
> myargs[5:]
< []