python argparse:'Namespace'错误

时间:2015-11-25 14:07:44

标签: python argparse

我正在尝试使用一些解析选项构建一个进程,一些是强制性的,另一些是optinal的。 我在使用以下代码时遇到问题:

    bandlist=[1,2,3,4,5,6,7,8]
    process=['rad', 'ref', 'radref']
    sensors=['LC', 'LO', 'LE', 'LT']
    series=['4', '5', '7', '8']
    usage = "usage: %prog [options] "
    parser = argparse.ArgumentParser(usage=usage)

    parser.add_argument('-d', '--directory', dest='directory', action='store', type=str, \
                      help='complete path of landsat product folder: mydir/filename/')

    parser.add_argument('-p', '--process', dest='operation', action='store', choices = process, \
                      help='process requested: radiance, reflectance, both', default='rad')

    parser.add_argument('-l', '--series', dest='satellite', action='store', choices = series , \
                      help='Landsat series:4, 5, 7, 8')

    parser.add_argument('-s', '--sensor', dest='sensor', action='store', choices = sensors, \
                      help='sensor acronymous, for example LO for Landsat OLI, or LE for Landsat ETM+, etc..', default=None)

    parser.add_argument('-o', '--output',   dest='output', type=str, \
            help='Directory of output raster. \n \
                Unless specified, output directory will be workDirectory/results/datafolder/. \n \
                If specified, the output directory wil be mydirectory/results/filename/rad (and/or ref)/', default=None)

    parser.add_argument('-x', action='store_true', dest='bool', help='activate iterative radiance and/or reflectance computation for all the bands', default=False)

    parser.add_argument('-b', '--bands', dest='bands', choices = bandlist, type=int, \
                      help='bands to process', nargs='*', default=None)

    (options, args) = parser.parse_args()

并出现以下错误:

Traceback (most recent call last):
File "C:\Users\lbernardi\Desktop\extract\LandsatTMroutine_RadiometricCorrection_1.0.py", line 1210, in <module>
main()
File "C:\Users\lbernardi\Desktop\extract\LandsatTMroutine_RadiometricCorrection_1.0.py", line 784, in main
(options, args) = parser.parse_args()
TypeError: 'Namespace' object is not iterable

我不明白错误是什么。 谢谢你的帮助

2 个答案:

答案 0 :(得分:3)

parse_args不会返回两个项目,它会返回一个项目。

args = parser.parse_args()

答案 1 :(得分:0)

执行(options, args) = ...分配时,解释程序发出错误。解析器返回了一个对象argparse.Namespace。但是赋值试图将它分成两个部分,例如

(options, args) = (args[0], args[1])

但是Namespace类定义没有像迭代那样实现列表或元组。理论上,自定义Namespace类可以这样做。

这是错误背后的技术细节。实际问题是argparseoptparse不同。

argparse文档的末尾开始:

  

使用args = parser.parse_args()替换(options,args)= parser.parse_args(),并为位置参数添加额外的ArgumentParser.add_argument()调用。请记住,现在在argparse上下文中之前称为选项的名称称为args。

optparse处理所有标记的字符串,并将它们的值放在options对象中(我忘记它的确切性质)。它可以处理的字符串作为第二个返回值的列表返回。

argparse希望您定义所有参数,包括已标记的参数(称为&#39; optionals&#39;)和未标记的参数(称为&#39; positionals&#39;)。因此,optparse列表中显示的args列中的值会显示在他们自己的名称/目标&#39;在argparse namespace

另一种调用ar​​gparse解析器的方法parser.parse_known_args的行为更像optparse。它无法处理的字符串将在extras列表中返回。

你提到你的一些论据是必需的,有些则不是。乍一看,您的代码可以使所有内容成为可选的&#39;。也就是说,如果您没有在命令行中包含相关标志,那么该参数将获得其默认值。

您的一个论点使用nargs='*'。如果没有指定,则默认值为None[](我会忘记详细信息)。

您还可以指定required=True参数,该参数可以选择&#39;需要。对于令人困惑的术语感到抱歉。在这种情况下,如果您不在命令行中提供标志,解析器将引发错误。

我没有仔细查看您之前的optparse问题,看看您是否期望args变量中的值。在argparse使用中,这些是&#39;定位&#39;并且是必需的(除非他们nargs使他们成为可选的&#39;)。

因此,虽然简单的解决方法只是使用args = parser.parse_args(),但我怀疑表面还有更多。

风格点:

parser.add_argument('-d', '--directory', dest='directory', action='store', type=str, \
                  help='complete path of t product folder: mydir/filename/')

可以简化为

parser.add_argument('-d', '--directory', \
                  help='complete path of landsat product folder: mydir/filename/')

如果没有给出dest,则从第一个长标志字符串开始。 store是默认的action值,str是默认值type

argparse中,type是一个函数,它将输入字符串转换为其他字符串。 intfloat是最常见的替代方案。 str可以正常工作,因为它什么都不做 - 返回它给出的相同字符串。 argparse实际上使用标识lambda函数作为默认type(例如lambda x:x)。