繁体   English   中英

python argparse:“命名空间”错误

[英]python argparse: 'Namespace' error

我正在尝试使用一些解析选项,一些强制性和其他最佳性来构建一个流程。 我的以下代码有问题:

    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

我不明白错误的原因。 谢谢您帮忙

parse_args不返回两项,而是返回一项。

args = parser.parse_args()

错误是由解释器在执行(options, args) = ...分配时发出的。 解析器返回了一个对象argparse.Namespace 但是作业试图将其分为两部分,例如

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

但是, Namespace类定义未实现类似迭代的列表或元组。 从理论上讲,自定义命名空间类可以这样做。

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

argparse文档的末尾开始:

用args = parser.parse_args()替换(options,args)= parser.parse_args()并添加其他ArgumentParser.add_argument()调用以获取位置参数。 请记住,以前在argparse上下文中称为选项的现在称为args。

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

argparse希望您定义所有参数,包括标记的参数(称为“可选”)和未标记的参数(称为“ positionals”)。 因此, optparse值将出现在args列表中,并出现在argparse namespace其自身的“名称/目标”下。

调用argparse解析器的另一种方式是parser.parse_known_args ,其行为更像optparse 无法处理的字符串将在extras列表中返回。

您提到您的某些论点是必需的,而某些则不是必需的。 乍一看,您的代码使所有内容均为“可选”。 也就是说,如果您不在命令行中包含相关标志,则该参数将获得其默认值。

您的参数之一使用nargs='*' 如果未指定,则默认值为None[] (我忘记了细节)。

您还可以指定required=True参数,该参数使“可选”成为必需。 抱歉,术语令人困惑。 在这种情况下,如果您未在命令行中提供该标志,则解析器将引发错误。

我没看过您以前的optparse问题,以了解您是否期望args变量中的值。 argparse用法中,这些是“位置”并且是必需的(除非它们的nargs使它们成为“可选”)。

因此,尽管简单的解决方法只是使用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

argparsetype是一个函数,该函数将输入字符串转换为其他字符串。 intfloat是最常见的选择。 str之所以起作用是因为它什么也不做-返回与给定的字符串相同的字符串。 argparse实际上使用标识lambda函数作为默认type (例如lambda x:x )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM