最近在學習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的時候沒這個限制,有不對的地方歡迎指正。