我正在尝试使用一些解析选项构建一个进程,一些是强制性的,另一些是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
我不明白错误是什么。 谢谢你的帮助
答案 0 :(得分:3)
parse_args
不会返回两个项目,它会返回一个项目。
args = parser.parse_args()
答案 1 :(得分:0)
执行(options, args) = ...
分配时,解释程序发出错误。解析器返回了一个对象argparse.Namespace
。但是赋值试图将它分成两个部分,例如
(options, args) = (args[0], args[1])
但是Namespace
类定义没有像迭代那样实现列表或元组。理论上,自定义Namespace类可以这样做。
这是错误背后的技术细节。实际问题是argparse
与optparse
不同。
从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
。
另一种调用argparse解析器的方法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
是一个函数,它将输入字符串转换为其他字符串。 int
和float
是最常见的替代方案。 str
可以正常工作,因为它什么都不做 - 返回它给出的相同字符串。 argparse
实际上使用标识lambda函数作为默认type
(例如lambda x:x
)。