python文件命名陷阱

来源:互联网 发布:淘宝仓库打包员4000 编辑:程序博客网 时间:2024/05/02 05:02

最近在学习python,学习到xml部分,按照教程弄了代码,如下:

from xml.parsers.expat import ParserCreateclass DefaultSaxHandler(object):    def start_element(self, name, attrs):        print('sax:start_element: %s, attrs: %s' % (name, str(attrs)))    def end_element(self, name):        print('sax:end_element: %s' % name)    def char_data(self, text):        print('sax:char_data: %s' % text)xml = r'''<?xml version="1.0"?><ol>    <li><a href="/python">Python</a></li>    <li><a href="/ruby">Ruby</a></li></ol>'''handler = DefaultSaxHandler()parser = ParserCreate()parser.StartElementHandler = handler.start_elementparser.EndElementHandler = handler.end_elementparser.CharacterDataHandler = handler.char_dataparser.Parse(xml)

运行结果如下:

Traceback (most recent call last):
  File "D:\workspace\python_test_project\test\xml.py", line 1, in <module>
    from xml.parsers.expat import ParserCreate
  File "D:\workspace\python_test_project\test\xml.py", line 1, in <module>
    from xml.parsers.expat import ParserCreate
ImportError: No module named 'xml.parsers'; 'xml' is not a package

百思不得姐,怎么会有错了,网上一搜才知道是我自己的文件名命名为了xml导致,不过,为什么我自己的文件名命名为xml就会导致这个错误呢?这还得结合python查找module顺序来说,python查找module的顺序如下:

1. 首先判断这个module是不是built-in即内建模块,
  如果是则引入内建模块,如果不是则在一个称为sys.path的list中寻找
2. sys.path在python脚本执行时动态生成,包括以下3个部分:
 a.脚本执行的位置,即当前路径
 b.环境变量中的PYTHONPATH, 即.bash_profile
 c.安装python时的依赖位置

而这里的xml属于第三方库不属于内建模块,那么打印下我的sys.pyth看下:

['D:\\workspace\\python_test_project\\test'
 'D:\\workspace\\python_test_project'
 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35-32\\DLLs'
 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35-32\\lib'
 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35-32'
 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35-32\\lib\\site-packages'
 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35-32\\python35.zip']

可以看到如上面所说,先找的是当前目录,当前目录的文件名我又命名为了xml,所以python解释器会试图从当前的xml.py文件去找xml.parsers.expat,那当然是找不到的了,那么我系统的parsers.expat在哪里呢?找了下路径如下:

%PYTHONPATH%\Lib\xml\parsers

现在我想你知道为什么命名为xml又在里面用到xml模块会报错了。

那么你会说,既然你说当引入非内建的第三方模块时,由于python引入module顺序的原因,文件名不能和使用的第三方模块名一致,那么使用内建模块文件名和内建模块名会报错吗?

就上面的代码添加sys内建模块的引入,然后打印sys.path 将文件名命名为sys:

然后运行下,我们可以看到没任何问题,这就验证了我们上面的说法,当在代码中使用第三方module时,文件名不能和module文一样,在使用内建module的时候没这个限制,有不对的地方欢迎指正。

0 0
原创粉丝点击