您的位置:首页 > 编程语言 > Python开发

python文件命名陷阱

2016-04-19 11:01 676 查看
最近在学习python,学习到xml部分,按照教程弄了代码,如下:

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的时候没这个限制,有不对的地方欢迎指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: