python启动加载

今天突然发现不能运行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, 上面的注释大致介绍了它的作用:

  1. 非常老的python版本会要求第一行写上import site,现在由python自动化import了
  2. site.py主要是向sys.path中添加模块的搜索路径,不同的操作系统会做不同的尝试
  3. 读取.pth文件,这些文件里每行都是一个路径
  4. 尝试加载一个名字叫sitecustomize的模块,这个模块里可以做很多个性化配置

所以可以想到,当像如下这样,设置了python的搜索路径PYTHONPATH,它也会优先于python后来尝试而找到的系统模块路径:

export PYTHONPATH=$PYTHONPATH:~/lib/pymodules/

所以又可以想到,当在当前目录下创建一个site.py文件,会导致如下代码输出不一样,也就会导致很多模块找不到,包括不能直接运行ipython:

>>> import sys
>>> sys.path

实验了一下,在当前路径下创建sitecustomize/init.py,启动python时,会首先执行该文件里的内容。

发表于 2014年10月21日 00:06   评论:0   阅读:2989  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo