Python內置模塊與標准庫


Python內置模塊就是標准庫(模塊)嗎?或者說Python的自帶string模塊是內置模塊嗎?

答案是:string不是內置模塊,它是標准庫。也就是說Python內置模塊和標准庫並不是同一種東西。

什么是內置模塊?在Python官方的文檔這里有說到:

Python’s standard library is very extensive, offering a wide range of facilities as indicated by the long table of contents listed below. The library contains built-in modules (written in C) that provide access to system functionality such as file I/O that would otherwise be inaccessible to Python programmers, as well as modules written in Python that provide standardized solutions for many problems that occur in everyday programming

它說明到內置模塊是用C寫的,提供了對系統功能的訪問。從Python的標准庫路徑下面是找不到 sys 這個庫的,原因就是它是操作系統相關,用C語言編寫的。可以看到 string.py 模塊,它是用Python寫的。

雖然前面說明了內置模塊不是標准庫,但是內置模塊可以划分到標准庫一類中去,這里需要注意的是划分歸類,而不是本質相同。這里說明內置模塊不是標准庫似乎有點吹毛求疵的意思,好像區不區分它們沒有什么意義?是的,大多數情況下,對它們之間沒有做區分的必要。但是在理解Python的模塊查找順序時,這卻是一個至關重要的差異。為了說明這個差異,先說明一下import的搜索路徑順序:

 import尋找模塊有兩個步驟:

  1. 搜索「內置模塊」(built-in module)
  2. 搜索 sys.path 中的路徑

而 sys.path 在初始化時,又會按照順序添加以下路徑:

  1. 當前執行腳本文件所在目錄
  2. 環境變量 PYTHONPATH中列出的目錄(類似環境變量 PATH,由用戶定義,默認為空);
  3. 模塊默認安裝目錄(通常是標准庫)

 從上面可以發現一個問題,如果一個模塊不是內置模塊,並且當前執行腳本文件所在目錄下有個和標准庫中同名的模塊,那么該模塊會覆蓋標准庫的同名模塊。舉例如下:

$ tree foo
foo
├── string.py
└── test.py

0 directories, 2 files

$ cat foo/string.py 
ascii_lowercase='this is personal module'
 
$ cat foo/test.py 
import string

print string.ascii_lowercase

文件結構如上所示。執行foo/test.py腳本,可以發現結果是"this is personal module",如果我們將string.py重命名為string2.py,則執行結果是標准庫string中的"abcdefghijklmnopqrstuvwxyz":

這表明標准庫的string.py模塊被當前腳本下的同名模塊覆蓋了。重命名后不再覆蓋,則能正確引用相應模塊了。

那么內置模塊一定是C語言寫的嗎?答案是:不是。因為對於os.py來說,它也是內置模塊,一些文件I/O模塊也是內置模塊,它們不可能都用C語言寫成,因為Python還需要通過它們來為Python程序提供支持,對於os.py是不是內置模塊持有懷疑的讀者,可以自行使用上面的同名模塊覆蓋特性進行測試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM