在Python代碼中, 文件的一開始幾乎無一例外地是
對于Python在哪里找到需要引用的包, 事實上Python提供了一個接口, 來獲得Python查找路徑的列表. 示例如下(去試試>>>)
運行這幾行代碼, 得到如下的結果.
對于這個結果,把它們分為幾類來講解
第一類, 很顯然, 這些路徑是Python安裝時內(nèi)置進去的.
第二類, 都是放在第一類的路徑中, 但是一眼就能看出它們其實都不是Python自帶的東西, 而是后安裝進去的.
這類路徑能夠讓Python納入搜索的范圍, 要歸功于一種特殊的文件, .pth文件. Python在搜索模塊的過程中, 如果遇到了.pth文件, 則將.pth文件中所羅列的路徑也納入到搜索路徑中來. 下面是一個.pth文件的示例
可以確定的是那兩行代碼完全可以沒有,可以直接羅列路徑就行了,絕對路徑 相對路徑都可以.甚至可以簡單地只有一行.第三類, 就是當前路徑. 這里的當前路徑是'/home/cliu/test'. Python搜索包的順序是按照sys.path輸出的列表的順序進行的, 并且搜索到第一個匹配的包即停止. 所以可以看出, 當前路徑是第一個搜索的路徑, 當前路徑中的包具有覆蓋所有其他包的能力. 如果你在當前路徑下放置了一個datetime.py, 那么你的標準庫datetime模塊就不能用了( ⊙o⊙ )哇, 所以起名字一定要謹慎, 不要與系統(tǒng)中其他的包重名.講完了Python搜索路徑的規(guī)則, 接下來我們講講如何改變這個規(guī)則.(與天斗, 與地斗, 與階級敵人斗)
哈哈, 這太簡單了. 既然搜索路徑存放在sys.path, 那我們就改變這個變量就好了. 對于Python這樣的動態(tài)語言, 并沒有什么只讀這回事.
我們來驗證一下, 把sys.path置為空列表, 是不是就什么包都找不到了呢?(去試試>>>)
看起來并不是這樣, 標準庫還是找得到的, 第三方庫確實統(tǒng)統(tǒng)找不到了. (果然官方還是要吃小炤的)
不過不必在意這個例子, 實際業(yè)界實踐中你永遠也不用這么做. 下面這段代碼才是你最常用的:
這段代碼經(jīng)常被用在Python腳本的最開始, 用來設置腳本需要引用的包的查找位置.除了設置sys.path, 還有一種改變搜索路徑的常用辦法, 那就是PYTHONPATH. PYTHONPATH是一個環(huán)境變量, 通常我們使用這個句子來改變它
PYTHONPATH為程序的部署提供了更好的靈活性, 你會發(fā)現(xiàn), 幾乎所有的Python部署工具, Python程序監(jiān)控工具都使用PYTHONPATH來配置搜索路徑.
聰明的你可能還想到了我們前面講的.pth文件*. 對, 創(chuàng)建一個.pth文件, 放置到默認路徑里, 同樣可以達到增加搜索路徑的目的. 不過, 這很不常用. 向系統(tǒng)中注入自己的代碼不是一個好的實踐, 除非你本身就是開發(fā)系統(tǒng), 或者中間件的程序員.到此, 你對于Python如何搜索需要的包已經(jīng)有足夠的了解了, 可以向更高的山峰攀登(≧▽≦)/啦啦啦