[英]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
类定义未实现类似迭代的列表或元组。 从理论上讲,自定义命名空间类可以这样做。
这就是错误背后的技术细节。 实际的问题是argparse
与optparse
不同。
从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
。
在argparse
, type
是一个函数,该函数将输入字符串转换为其他字符串。 int
和float
是最常见的选择。 str
之所以起作用是因为它什么也不做-返回与给定的字符串相同的字符串。 argparse
实际上使用标识lambda函数作为默认type
(例如lambda x:x
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.