getopt python

时间:2018-03-05 10:29:08

标签: python getopt

在下面的代码中我混合了短期和长期期权。还要注意“--longoption1”用“=”分隔,“ - longoption2”用空格分隔。但getopt不区分空间和=长期选项。相反,对于短期期权,短期权(x,y,z)后面的任何内容都被视为期权的价值。注意“-x:shortvalue1 -y shortvalue2 -zshortvalue3”x用空格分隔,y用空格分隔,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)

1 个答案:

答案 0 :(得分:1)

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

从GNU手册页:

  

长选项可能会采用--arg=param--arg param形式的参数。

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

--longoption3 longvalue3

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