【Python 脚本报错】AttributeError:‘module‘ has no attribute ‘xxx‘的解决方法

1、出现的问题

最近在编写Python脚本过程中遇到一个问题比较奇怪:

File "/home/anirrudh/.virtualenvs/ml4t2/local/lib/python2.7/site-packages/numpy/ma/core.py", line 30, in <module>
import numpy.core.umath as umath
AttributeError: 'module' object has no attribute 'core'

Python是脚本正常的,但执行报错”AttributeError: ‘module’ object has no attribute ‘xxx’”,其实是.pyc文件存在问题。

2、问题解决

问题定位:查看import库的源文件,发现源文件存在且没有错误,同时存在源文件的.pyc文件。
问题解决方法:删除该库的.pyc文件,重新运行代码;或者找一个可以运行代码的环境,拷贝替换当前机器的.pyc文件即可。

参照以上通用解决方法并没有解决我的报错,最后发现自己犯了一个大错误,就是自己新建的python文件名字和内置的函数名冲突,修改了python文件的名字就可以正常运行无报错了。

3、pyc文件

3.1 pyc文件介绍

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

3.2 pyc文件位置

  • 在Python2.x中,为导入的模块创建的 .pyc 文件,会被放置在和.py文件同一目录中;在Python 3.x中,.pyc文件保存在__pycache__目录中;如果你想创建.pyc文件,启动一个Python解释器,只需import你选择的模块,并且根据创建它们的Python解释器的不同而命名。然而,没有为程序的主脚本创建.pyc文件,换句话说,如果在命令行上调用“python myscript.py”,myscript.py将没有.pyc文件。(即 .pyc文件它们是为导入的模块而不是直接运行的文件创建的)

参考:https://www.cnpython.com/qa/60180