Python模組查詢路徑

昀溪發表於2018-08-20

在編寫Python程式時候命名在IDE中執行正常可是到了伺服器上就出現各種問題,經常發生的就是如下的錯誤:

ImportError: No module named 'hello'

這個錯誤我相信大家都不陌生學習初期都會遇到尤其是你引入第三方模組(從網上下載的或者是你自己寫的)的時候可能會發生。那是為什麼呢?在Python中這些東西叫做模組,可是在系統中其實就是目錄,既然你要使用這些模組也就是目錄裡面的內容那麼Python直譯器肯定要能找到才行,其實就跟系統中的環境變數一樣,編譯安裝程式的時候經常要手動設定環境變數為什麼呢?同樣的道理如果你不設定那麼你使用這些命令的時候就要使用絕對路徑或者進入到命令所在目錄才可以,你要想隨時隨地使用就必須設定環境變數,告訴系統去哪裡找這些命令。知道原因之後我們看看Python是怎麼找這些模組的?

Python直譯器如何找到模組

sys.path

這個函式輸出的是一個列表它就包含了搜尋模組的路徑,這個列表的第一個路徑就是當前路徑,所謂當前路徑就是你執行Python程式的當前路徑,比如你的程式放在/home/zhangsan/test.py, 在執行這個程式的時候,這個程式的sys.path列表的第一個路徑就是/home/zhangsan,其餘的就是系統預設的路徑,如下圖:

Python直譯器就是透過這個類別來搜尋模組的,如果你引入的模組不在這個列表裡那麼顯然就找不到了,也就有了上面的錯誤。那如何新增呢?

既然sys.path輸出是一個列表,那麼我們就可以在列表中新增。看下圖:

兩個列表是不是不同呢?

1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 
4 import sys
5 
6 print sys.path
7 # 新增
8 sys.path.insert(1, "/work/apps/mymodules")
9 print sys.path
View Code

這裡為什麼使用insert呢,其實你使用append也可以,使用插入就是為了讓它快速找到。這種是動態新增的,作用範圍僅僅是當前py檔案,如果你的很多py檔案都引入了其他模組怎麼辦?一個一個修改太麻煩了。

PYTHONPATH

這是個環境變數,系統預設沒有。你需要自己設定。

編輯 vim ~/.bashrc

export PYTHONPATH=$PYTHONPATH:/YOU_MODULE_DIRECTORY

然後執行 source ~/.bashrc 使其生效即可。不過不推薦這種方式,因為它會改變prefix和exec_prefix的值,預設情況下prefix和exec_prefix都是/usr/local

.pth檔案

這種方式很簡單便於管理,在需要大量新增外部路徑的時候非常推薦,而且是永久生效。啟動Python程式時候,直譯器就會遍歷目錄,遇到pth就會讀取這個檔案中的內容並新增到sys.path中。這裡以系統自帶的Python2.7為例說明

/usr/lib/python2.7/site-packages

其內容就是路徑

 

相關文章