python檔案命名陷阱__python

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.