python文件命名陷阱
2016-04-19 11:01
676 查看
最近在学习python,学习到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的时候没这个限制,有不对的地方欢迎指正。
from xml.parsers.expat import ParserCreate class 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_element parser.EndElementHandler = handler.end_element parser.CharacterDataHandler = handler.char_data parser.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的时候没这个限制,有不对的地方欢迎指正。
相关文章推荐
- ml的线性回归应用(python语言)
- python和c#通用一致的des加密采用CBC和PKCS7
- Python-While刷博爬虫
- Selenium2 Python 自动化测试实战学习笔记(七)
- python 中 dist-packages 和 site-packages 的区别
- LeetCode[Array]----3Sum Closest
- python 列表 字典 读写文件:pickle模块的基本使用
- python默认编码问题
- Python学习笔记(八)——有关文件的操作
- python实现简单socket通信的方法
- 使用DataFrame和numpy生成交叉表(笛卡尔积)
- 【python项目实战】BBS论坛(5)帖子列表展示
- Python实现MapReduce
- python实现域名系统(DNS)正向查询的方法
- Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED
- Python实现文件复制删除
- python基础教程第3章——字符串
- 跟黄哥学python序列文章之python方法链(method chaining)
- 跟黄哥学python序列文章之python方法链(method chaining)
- Python-回文检测和布尔操作(and,or,not)