属性错误:'Namespace'对象没有属性。

34

我正在编写一个程序,使用urllib2从http网站下载CSV数据。当在Python中运行时,程序可以正常工作,但是我还尝试使用argparse从命令行输入url。

在运行程序时,我遇到了以下错误:

File "urlcsv.py", line 51, in downloadData
    return urllib2.urlopen(url)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 396, in open
    protocol = req.get_type()
AttributeError: 'Namespace' object has no attribute 'get_type'

我猜这是urllib2库的一部分,因为这不是我编写的代码。 有没有人遇到过类似的问题,无论是argparse还是urllib2模块?

代码的相关部分如下:

parser = argparse.ArgumentParser()
parser.add_argument("url")


def main():
    """Runs when the program is opened"""

    args = parser.parse_args()
    if args is False:
        SystemExit
    try:
        csvData = downloadData(args)
    except urllib2.URLError:
        print 'Please try a different URL'
        raise
    else:
        LOG_FILENAME = 'errors.log'
        logging.basicConfig(filename=LOG_FILENAME,
                            level=logging.DEBUG,
                            )
        logging.getLogger('assignment2')
        personData = processData(csvData)
        ID = int(raw_input("Enter a user ID: "))
        if ID <= 0:
            raise Exception('Program exited, value <= 0')
        else:
            displayPerson(ID)
            main()

def downloadData(url):

    return urllib2.urlopen(url)

堆栈跟踪当然指示了urllib2模块中的问题,这是从给定的路径中得出的结论。 - nbro
请展示您编写的代码以及输入的内容。 - user764357
你发布的代码中没有包含错误行。你将req设置为什么了? - user559633
@tristan 行 protocol = req.get_type() 是Python标准库中urllib2模块的一部分; 这不是我编写的代码,而是由 urllib2.urlopen(url) 调用的代码。 - Sam Cohen-Devries
但是您在示例中没有包含设置protocol=req.get_type()的行,这意味着您仍然需要“发布代码”,以便说。我不知道您希望req存在的位置,因为没有成员方法urllib2.req - user559633
3个回答

26
你正在将命令行参数解析到名为argsNamespace中,该Namespace具有设置为已解析参数的属性。但是你正在将整个命名空间传递给downloadData,而不仅仅是URL。然后将此命名空间传递给urlopen,但它不知道该怎么处理。相反,请调用downloadData(args.url)

12

长话短说。

parser.parse_args()返回的对象中的参数应该通过属性访问而不是通过[]语法访问。

错误的写法

args = parser.parse_args()
args['method']

正确

args = parser.parse_args()
args.method

1
如果参数名称包含特殊字符怎么办?例如,我使用“<method>”而不是“method”。但是,“args.<method>”显然是无效的。 - gye
1
@gye 在你的参数名中不要使用特殊字符? - Michael Dorst

1

由于选项字符串前面有空格,导致我遇到了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接