今天突然发现不能运行python了,大为惊讶,后来才发现是当前目录下的abc.py导致的,出错信息如下:
Traceback (most recent call last):
File "/usr/lib/python2.7/site.py", line 68, in <module>
import os
File "/usr/lib/python2.7/os.py", line 398, in <module>
import UserDict
File "/usr/lib/python2.7/UserDict.py", line 83, in <module>
import _abcoll
File "/usr/lib/python2.7/_abcoll.py", line 11, in <module>
from abc import ABCMeta, abstractmethod
ImportError: cannot import name ABCMeta
其实/usr/lib/python2.7/下也有一个abc.py,而python优先加载了当前路径下的abc.py,导致出问题了。
从上面的出错信息可知,python在执行脚本之前,加载了一些文件,其入口是site.py。打开/usr/lib/python2.7/site.py, 上面的注释大致介绍了它的作用:
import site
,现在由python自动化import了所以可以想到,当像如下这样,设置了python的搜索路径PYTHONPATH,它也会优先于python后来尝试而找到的系统模块路径:
export PYTHONPATH=$PYTHONPATH:~/lib/pymodules/
所以又可以想到,当在当前目录下创建一个site.py文件,会导致如下代码输出不一样,也就会导致很多模块找不到,包括不能直接运行ipython:
>>> import sys
>>> sys.path
实验了一下,在当前路径下创建sitecustomize/init.py,启动python时,会首先执行该文件里的内容。