Python模塊搜索路徑

最近在學習python的C++擴展(pybind11),寫完一個擴展模塊之後,想要在自己的環境中以後都能自動導入這個模塊,而不用手動去添加路徑(修改sys.path)應該怎麼弄?以前最開始學習Python的時候看過這塊內容,然而時間長了總會記憶不清,就再回顧了一遍。 
概括來說,Python的自動搜索路徑是這樣的:

1 程序的根目錄
2 PYTHONPATH環境變量設置的目錄
3 標準庫的目錄
4 任何能夠找到的.pth文件的內容
5 第三方擴展的site-package目錄


最終,這五個部分的拼接成爲了sys.path,其中第一和第三、第五部分是自動定義的。 
根目錄(自動) 
Python首先在根目錄搜索要導入的文件。這個根目錄的入口依賴於你怎麼運行代碼;當你運行一個程序時,這個入口就是程序運行入口(top-level script file)文件所在的目錄;當你用交互式窗口期運行代碼時,這個入口就是你所在的工作目錄。 
PYTHONPATH 目錄(可配置的) 
接下來,python會搜索PYTHONPATH環境變量裏列出的所有目錄,因爲這個搜索在標準庫之前,所以要小心不要覆蓋一些標準庫的同名模塊。 
標準庫目錄(自動) 
這個沒什麼好說的,pyton會自動搜尋標準庫模塊所在的目錄。 
.pth文件列出的目錄(可配置的) 
這是用的比較少的一個python特性。它允許用戶以每行一個的方式列出搜索路徑,它和PYTHONPATH環境變量的不同是會在標準庫路徑之後搜索;而且它是針對這個python安裝的,而不是針對用戶的(環境變量會隨着用戶的不同而不同)。 那麼,.pth文件應該放在哪裏呢?可以通過以下代碼找到.pth文件可以放置的位置:

import site
site.getsitepackages()

在我的環境中,輸出如下:

['C:\\Python27', 'C:\\Python27\\lib\\site-packages']

Lib/site-package目錄(自動) 
最後,python會在搜索路徑上自動加上site-packages目錄,這一般是第三方擴展安裝的地方,一般是由distutils工具發佈的。

舉例說明
講了這麼多,現在我們舉個小栗子。我的python環境是windows7 + python 2.7。 
1. 首先,我們新建一個環境變量PYTHONPATH,在裏面加上目錄E:\python_extensions

然後,我們在C:\Python27目錄下新增一個add.pth文件,裏面的內容是: E:\python_extensions2
最後,我們在E:\python_extensions和E:\python_extensions2目錄下分別新建模塊test.py和test2.py,裏面都寫了一個test方法。 
我們打開交互解釋器,結果如下:


可以看到,我們可以直接導入這兩個目錄下的模塊了。查看sys.path:

嗯,這兩個路徑已經自動加入sys.path變量了。

總結
本文簡要回顧了python的自動搜索路徑,以及如何配置一些搜索路徑以使得python在啓動時能夠將某些目錄加到搜索路徑。當然,這些自動搜索路徑隨着python版本和實現的不同會有細微差別,但對於目前的使用來說已經夠了。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章