getopt 中的多头选项和空头选项 python

long options and short options in getopt python

在下面的代码中,我混合了短选项和长选项。另请注意,“--longoption1”由“=”分隔,“--longoption2”由 space 分隔。但是 getopt 不区分 space 和 = 对于长选项。相反,对于空头期权,空头期权 (x,y,z) 后的任何内容都被视为期权的价值。请注意“-x:shortvalue1 -y shortvalue2 -zshortvalue3”x 由 : 分隔,y 由 space 分隔并且 z 甚至没有被任何分隔,但仍然像我想象的那样进行 getopt 解析。

import sys, getopt

commandoptions = "--longoption1=longvalue1 --longoption2 longvalue2 -x:shortvalue1 -y shortvalue2 -zshortvalue3"
parsedoptions = commandoptions.split()
print("Split by space ", parsedoptions)

opts, additionalArgs = getopt.getopt(parsedoptions, "x:y:z:", ["longoption1=", "longoption2="])
print("options ", opts)

继续,为什么下面的代码会失败?请注意,“--longoption3longvalue3”类似于“-zshortvalue3”。我的意思是选项和它的值没有分开。在这种情况下,空头期权仍然有效,但多头期权无效。相反,它会导致以下错误:

GetoptError: option --longoption3longvalue3 not recognized

我一直在关注 https://docs.python.org/3/library/getopt.html,但我找不到我正在寻找的答案的任何参考资料。

import sys, getopt

commandoptions = "--longoption1=longvalue1 --longoption2 longvalue2 --longoption3longvalue3 -x:shortvalue1 -y shortvalue2 -zshortvalue3"
parsedoptions = commandoptions.split()
print("Split by space ", parsedoptions)

opts, additionalArgs = getopt.getopt(parsedoptions, "x:y:z:", ["longoption1=", "longoption2=", "longoption3="])
print("options ", opts)

这是遵循 BSD and GNU getopt_long(3) 约定的正确预期行为。 (请注意,"long option" 想法源自 GNU,不属于 POSIX API)。

来自 GNU 手册页:

A long option may take a parameter, of the form --arg=param or --arg param.

要将长选项传递给程序,选项的名称和值必须用等号连接 =,或者作为 argv 中的相邻项分隔,即

--longoption3 longvalue3

将它们连接在一起将导致底层 getopt_long 库函数将此部分识别为一个名称为 longoption3longvalue3 的长选项,正确地无法识别。