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