现在的位置: 首页 > 软件测试 > 测试工具 > 软件测试 > 正文

Python脚本报错AttributeError: ‘module’ object has no attribute’xxx’解决方法

2014年04月30日 测试工具, 软件测试 ⁄ 共 787字 ⁄ 字号 评论 16 条 ⁄ 阅读 160,828 次

最近在编写Python脚本过程中遇到一个问题比较奇怪:Python脚本完全正常没问题,但执行总报错"AttributeError: 'module' object has no attribute 'xxx'"。这其实是.pyc文件存在问题。

问题定位:

查看import库的源文件,发现源文件存在且没有错误,同时存在源文件的.pyc文件

 

问题解决方法:

1. 命名py脚本时,不要与python预留字,模块名等相同

2. 删除该库的.pyc文件(因为py脚本每次运行时均会生成.pyc文件;在已经生成.pyc文件的情况下,若代码不更新,运行时依旧会走pyc,所以要删除.pyc文件),重新运行代码;或者找一个可以运行代码的环境,拷贝替换当前机器的.pyc文件即可

 

示例:

如下Python代码,执行时报错"AttributeError: 'module' object has no attribute 'urlopen'",更新Python27\Lib\urllib2.pyc文件后,即可正常运行。

import urllib2
url = "http://www.baidu.com"
f = urllib2.urlopen(url, timeout=5).read()
print len(f)

附录:

pyc文件介绍

pyc文件,是python编译后的字节码(bytecode)文件。只要你运行了py文件,python编译器就会自动生成一个对应的pyc字节码文件。这个pyc字节码文件,经过python解释器,会生成机器码运行(这也是为什么pyc文件可以跨平台部署,类似于java的跨平台,java中JVM运行的字节码文件)。下次调用直接调用pyc,而不调用py文件。直到你这个py文件有改变。python解释器会检查pyc文件中的生成时间,对比py文件的修改时间,如果py更新,那么就生成新的pyc。

目前有 16 条留言    访客:15 条, 博主:1 条

  1. 王小七 2015年03月11日 15:05  @回复  Δ1楼 回复

    按照楼主的方法试了,还是不行呀~

  2. 清风 2015年06月03日 13:57  @回复  Δ2楼 回复

    xx.py文件名时,xx不要是python保留字

  3. dearapplejj 2015年08月23日 20:10  @回复  Δ3楼 回复

    怎样更新呀

  4. 日尚阳光 2015年09月30日 19:01  @回复  Δ4楼 回复

    你说的不对,应该是Python文件名不要使用Python系统库的名字,就是因为使用了Python系统库的名字,所以在编译的时候才会产生.pyc文件。正常的Python文件在编译运行的时候是不会产生.pyc文件的!


    • 管理员
      安生 2015年10月08日 09:04  @回复  ∇地下1层 回复

      好滴,受教了….谢谢

  5. 孤云 2015年11月17日 17:51  @回复  Δ5楼 回复

    改变函数名称就可以了,这其实是我们定义的函数名称与系统,定义的函数名称相同 :razz:

  6. 侃侃 2016年01月25日 00:59  @回复  Δ6楼 回复

    方法不可行。我的:自定义类属性常量,且删除pyc文件。一样有问题

  7. devpeng 2016年04月23日 17:13  @回复  Δ7楼 回复

    并没有什么用。。。

  8. 123 2016年06月25日 19:42  @回复  Δ8楼 回复

    meiyong

  9. 成长的企鹅 2016年07月05日 15:06  @回复  Δ9楼 回复

    还有一种可能是python的版本太旧,crontab下面运行默认使用的是/usr/bin/python下面的python。 /usr/bin/python -v 看下是使用的什么版本。

  10. 张星 2016年07月25日 16:03  @回复  Δ10楼 回复

    也不一定吧,AttributeError: ‘module’ object has no attribute ‘indo’我的提示这个,结果是我调用 logging.indo()这里写错了,应该是 logging.info()

    • 浅蓝色 2016年07月26日 13:16  @回复  ∇地下1层 回复

      你这是方法写错了,确定方法没写错的时候报错可能是这种情况导致的。

  11. 2016年08月29日 08:34  @回复  Δ11楼 回复

    超赞,感谢~~  看到这里才想起这个问题.

  12. dddddddl 2016年11月06日 21:01  @回复  Δ12楼 回复

    谢谢 帮到我了

  13. DODO 2016年12月09日 16:27  @回复  Δ13楼 回复

    请问这个程序为什么会出错呀:
    # -*- coding: utf-8 -*-
    ”’
    Created on 2016年12月8日

    @author: Administrator
    ”’
    from lib2to3.pytree import WildcardPattern

    class Horse(object):
    """Horse represents a Horse"""
    species = "Equus ferus caballus"
    def __init__(self, color, weight, wild=False):
    self.color = color
    self.weight = weight
    self. wild = wild
    def __repr__(self):
    return "%s horse weight %f and wild status is %b" %(self.color,self.weight,self.wild)

    def make_sound(self):
    print ("neighhhh")

    def movement(self):
    return "walk"

    class RaceHorse(Horse):
    def movement(self):
    return "run"

    def movement_slow(self):
    return super(Horse,self).movement()

    def __repr__(self):
    return "%s race horse weight %f and wild status is %b" %(self.color,self.weight,self.wild)

    horse3 = RaceHorse("White",200)
    print (horse3.movement_slow())
    print (horse3.movement())

    运行结果是:Traceback (most recent call last):
    File "D:workspacePythonLearn1srcsrcClassName.py", line 38, in <module>
    print (horse3.movement_slow())
    File "D:workspacePythonLearn1srcsrcClassName.py", line 31, in movement_slow
    return super(Horse,self).movement()
    AttributeError: ‘super’ object has no attribute ‘movement’
    说父类里的movement() 未定义,我明明定义了的

    • Joo 2016年12月12日 11:00  @回复  ∇地下1层 回复

      31行错了,return super(Horse,self).movement()应该是return super(RaceHorse,self).movement()

给我留言

留言无头像?