【问题标题】:Python 'getopt' syntax, allowing optional command line arguments, longopts not recognizedPython 'getopt' 语法,允许可选的命令行参数,longopts 无法识别
【发布时间】:2021-03-08 00:39:08
【问题描述】:
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”没有被命令行识别。

谢谢。

尊敬的,

Slid3r

【问题讨论】:

  • 您知道,如果您没有吞下来自 getopt.getopt 的所有异常,Python 会为您提供一些方便的消息,提供一些有关问题所在的信息。

标签: python argv getopt


【解决方案1】:

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

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

第一个是(选项,值)对的列表;第二个是在选项列表被剥离后留下的程序参数列表(这是 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:]
< []

【讨论】:

  • 谢谢!但是...... [-p --paper] 选项并不意味着捕获任何值,它是一个布尔值。因此 : 和 = 在定义中是不正确的,为什么我忽略了 'args' 值捕获。我是否错误地假设如果用户不输入命令行参数,'argv = sys.argv[1:]' 会引发错误?编辑:是的,我的假设是错误的。删除了错误处理。仍然无法识别 longopts。
  • 我当时误解了,我会修改我的答案。至于抛出错误,切片语法是宽容的,因为如果您尝试切片超过可迭代对象的末尾,它不会抛出,它只会返回一个空数组。
  • 我不确定,这里是我一直在运行并测试它的地方:repl.it/join/gdfkzjib-wesh1 看看你是否能发现它与你的实现之间的任何差异?
  • 您能否修改屏幕截图以包含上面您调用它的行?
  • 啊,现在有道理了!长参数需要与-- 一起使用,短参数需要与- 一起使用。它应该使用-p--paper 运行。
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 2016-06-10
  • 2015-10-01
  • 1970-01-01
  • 2021-08-21
  • 2012-01-27
  • 2018-07-05
  • 1970-01-01
相关资源
最近更新 更多