no module named xxx

python的常见错误,意思非常明确,这个模块找不到了。导致的原因也很确定:

  1. 确实没有安装这个模块
  2. 路径不对

第一个把模块安装上就完事了,第二个往往是导致这个错误最常见的原因。

如果你能确定你已经安装了这个模块,那肯定是import的路径有问题。import导入时,搜索的路径是有顺序的,查看当前python导入模块的搜索路径,可以在交互命令行中执行下面的命令:

In [1]: import sys

In [2]: sys.path
Out[2]:
['',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/bin',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL',
 '/Library/Python/2.7/site-packages',
 '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/extensions',
 '/Users/youwangqiu/.ipython']

可以看到,我使用的python是现在当前路径(' ')下搜索,然后去系统的各个路径下搜索。而这个机制将导致一个很大的问题

##不要乱给你的.py文件命名
你写了一个比较大的应用,多个.py文件,相互之间有import。给这些.py文件取名是件麻烦事,一般都是根据文件的功能来取名的嘛。所以你就将一个进行http请求的文件命名成了requests.py(同时,你的应用需要系统的requests模块)。调试整个应用的时候,你发现,这个requests模块怎么和教程上的不一样啊,怎么该有的函数都没有啊,要你有什么卵用!

requests模块说:怪我喽…

大哥,你导入的不是系统的requests模块啊,你导入的是你的requests.py啊,当然什么都没有了。

这里虽然没有报no module named的错误,但是这个错误更难调试,和no module named xxx师出同源,如果你导入的requests模块下的一个函数或类的话,no module named xxx就出现了。

所以说给文件命名之前先考虑清楚,不要潇洒地随便写,不然你就是自己挖坑自己跳。

如果你发现自己确实犯了这个错误,并且改了文件名,请千万记住,还要把当前目录下相应的.pyc删除掉,不然还是没用,至于为什么,请自行参考任何一本python教程。