Python匯入模組的3種詳細教程
很多初學者經常遇到這樣的問題,即自定義Python模板後,在其它檔案中用 import(或 from...import) 語句引入該檔案時,Python 直譯器同時如下錯誤:
ModuleNotFoundError: No module named '模組名'
意思是 Python 找不到這個模組名,這是什麼原因導致的呢?要想解決這個問題,讀者要先搞清楚 Python 直譯器查詢模組檔案的過程。
通常情況下,當使用 import 語句匯入模組後,Python 會按照以下順序查詢指定的模組檔案:
- 在當前目錄,即當前執行的程式檔案所在目錄下查詢;
- 到 PYTHONPATH(環境變數)下的每個目錄中查詢;
- 到 Python 預設的安裝目錄下查詢。
以上所有涉及到的目錄,都儲存在標準模組 sys 的 sys.path 變數中,通過此變數我們可以看到指定程式檔案支援查詢的所有目錄。換句話說,如果要匯入的模組沒有儲存在 sys.path 顯示的目錄中,那麼匯入該模組並執行程式時,Python 直譯器就會丟擲 ModuleNotFoundError(未找到模組)異常。
解決“Python找不到指定模組”的方法有 3 種,分別是:
- 向 sys.path 中臨時新增模組檔案儲存位置的完整路徑;
- 將模組放在 sys.path 變數中已包含的模組載入路徑中;
- 設定 path 系統環境變數。
不過,在詳細介紹這 3 種方式之前,為了能更方便地講解,本節使用前面章節已建立好的 hello.py 自定義模組檔案(D:\python_module\hello.py)和 say.py 程式檔案(C:\Users\mengma\Desktop\say.py,位於桌面上),它們各自包含的程式碼如下:
- #hello.py
- def say ():
- print("Hello,World!")
- #say.py
- import hello
- hello.say()
顯然,hello.py 檔案和 say.py 檔案並不在同一目錄,此時執行 say.py 檔案,其執行結果為:
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\say.py", line 1, in <module>
import hello
ModuleNotFoundError: No module named 'hello'
可以看到,Python 直譯器丟擲了ModuleNotFoundError 異常。接下來,分別用以上 3 種方法解決這個問題。
匯入模組方式一:臨時新增模組完整路徑
模組檔案的儲存位置,可以臨時新增到 sys.path 變數中,即向 sys.path 中新增 D:\python_module(hello.py 所在目錄),在 say.py 中的開頭位置新增如下程式碼:
- import sys
- sys.path.append('D:\\python_module')
注意:在新增完整路徑中,路徑中的 '\' 需要使用 \ 進行轉義,否則會導致語法錯誤。再次執行 say.py 檔案,執行結果如下:
Hello,World!
可以看到,程式成功執行。在此基礎上,我們在 say.py 檔案中輸出 sys.path 變數的值,會得到以下結果:
['C:\\Users\\mengma\\Desktop', 'D:\\python3.6\\Lib\\idlelib', 'D:\\python3.6\\python36.zip', 'D:\\python3.6\\DLLs', 'D:\\python3.6\\lib', 'D:\\python3.6', 'C:\\Users\\mengma\\AppData\\Roaming\\Python\\Python36\\site-packages', 'D:\\python3.6\\lib\\site-packages', 'D:\\python3.6\\lib\\site-packages\\win32', 'D:\\python3.6\\lib\\site-packages\\win32\\lib', 'D:\\python3.6\\lib\\site-packages\\Pythonwin','D:\\python_module']
該輸出資訊中,紅色部分就是臨時新增進去的儲存路徑。需要注意的是,通過該方法新增的目錄,只能在執行當前檔案的視窗中有效,視窗關閉後即失效。
匯入模組方式二:將模組儲存到指定位置
如果要安裝某些通用性模組,比如複數功能支援的模組、矩陣計算支援的模組、圖形介面支援的模組等,這些都屬於對 Python 本身進行擴充套件的模組,這種模組應該直接安裝在 Python 內部,以便被所有程式共享,此時就可藉助於 Python 預設的模組載入路徑。
Python 程式預設的模組載入路徑儲存在 sys.path 變數中,因此,我們可以在 say.py 程式檔案中先看看 sys.path 中儲存的預設載入路徑,向 say.py 檔案中輸出 sys.path 的值,如下所示:
['C:\\Users\\mengma\\Desktop', 'D:\\python3.6\\Lib\\idlelib', 'D:\\python3.6\\python36.zip', 'D:\\python3.6\\DLLs', 'D:\\python3.6\\lib', 'D:\\python3.6', 'C:\\Users\\mengma\\AppData\\Roaming\\Python\\Python36\\site-packages','D:\\python3.6\\lib\\site-packages', 'D:\\python3.6\\lib\\site-packages\\win32', 'D:\\python3.6\\lib\\site-packages\\win32\\lib', 'D:\\python3.6\\lib\\site-packages\\Pythonwin']
上面的執行結果中,列出的所有路徑都是 Python 預設的模組載入路徑,但通常來說,我們預設將 Python 的擴充套件模組新增在lib\site-packages
路徑下,它專門用於存放 Python 的擴充套件模組和包。
所以,我們可以直接將我們已編寫好的 hello.py 檔案新增到lib\site-packages
路徑下,就相當於為 Python 擴充套件了一個 hello 模組,這樣任何 Python 程式都可使用該模組。
移動工作完成之後,再次執行 say.py 檔案,可以看到成功執行的結果:
Hello,World!
匯入模組方式三:設定環境變數
PYTHONPATH 環境變數(簡稱 path 變數)的值是很多路徑組成的集合,Python 直譯器會按照path 包含的路徑進行一次搜尋,直到找到指定要載入的模組。當然,如果最終依舊沒有找到,則 Python 就報ModuleNotFoundError 異常。
由於不同平臺,設定 path 環境變數的設定流程不盡相同,因此接下來就使用最多的 Windows、Linux、Mac OS X 這 3 個平臺,給讀者介紹如何設定 path 環境變數。
在 Windows 平臺上設定環境變數
首先,找到桌面上的“計算機”(或者我的電腦),並點選滑鼠右鍵,單擊“屬性”。此時會顯示“控制面板\所有控制面板項\系統”視窗,單擊該視窗左邊欄中的“高階系統設定”選單,出現“系統屬性”對話方塊,如圖 1 所示。
圖 1 系統屬性對話方塊
如圖 1 所示,點選“環境變數”按鈕,此時將彈出圖 2 所示的對話方塊:
圖 2 環境變數對話方塊
如圖 2 所示,通過該對話方塊,就可以完成 path 環境變數的設定。需要注意的是,該對話方塊分為上下 2 部分,其中上面的“使用者變數”部分用於設定當前使用者的環境變數,下面的“系統變數”部分用於設定整個系統的環境變數。推薦第一留學
通常情況下,建議大家設定設定使用者的 path 變數即可,因為此設定僅對當前登陸系統的使用者有效,而如果修改系統的 path 變數,則對所有使用者有效。
對於普通使用者來說,設定使用者 path 變數和系統 path 變數的效果是相同的,但 Python 在使用 path 變數時,會先按照系統 path 變數的路徑去查詢,然後再按照使用者 path 變數的路徑去查詢。
這裡我們選擇設定當前使用者的 path 變數。單擊使用者變數中的“新建”按鈕, 系統會彈出如圖 3 所示的對話方塊。
圖 3 新建PYTHONPATH環境變數
其中,在“變數名”文字框內輸入 PYTHONPATH,表明將要建立名為 PYTHONPATH 的環境變數;在“變數值”文字框內輸入.;d:\python_ module
。注意,這裡其實包含了兩條路徑(以分號 ;作為分隔符):英國留學哪些城市好:http://www.liuxue1.com/yingguo/yingguoliuxuechengshi2.html
- 第一條路徑為一個點(.),表示當前路徑,當執行 Python 程式時,Python 將可以從當前路徑載入模組;
- 第二條路徑為
d:\python_ module
,當執行 Python 程式時,Python 將可以從d:\python_ module
中載入模組。
然後點選“確定”,即成功設定 path 環境變數。此時,我們只需要將模組檔案移動到和引入該模組的檔案相同的目錄,或者移動到d:\python_ module
路徑下,該模組就能被成功載入。
在 Linux 上設定環境變數
啟動 Linux 的終端視窗,進入當前使用者的 home 路徑下,然後在 home 路徑下輸入如下命令:
ls - a
該命令將列出當前路徑下所有的檔案,包括隱藏檔案。Linux 平臺的環境變數是通過 .bash_profile 檔案來設定的,使用無格式編輯器開啟該檔案,在該檔案中新增 PYTHONPATH 環境變數。也就是為該檔案增加如下一行:
#設定PYTHON PATH 環境變數
PYTHONPATH=.:/home/mengma/python_module
Linux 與 Windows 平臺不一樣,多個路徑之間以冒號(:)作為分隔符,因此上面一行同樣設定了兩條路徑,點(.)代表當前路徑,還有一條路徑是/home/mengma/python_module
(mengma 是在 Linux 系統的登入名)。
在完成了 PYTHONPATH 變數值的設定後,在 .bash_profile 檔案的最後新增匯出 PYTHONPATH 變數的語句。
#匯出PYTHONPATH 環境變數
export PYTHONPATH
重新登入 Linux 平臺,或者執行如下命令:
source.bash_profile
這兩種方式都是為了執行該檔案,使在檔案中設定的 PYTHONPATH 變數值生效。
在成功設定了上面的環境變數之後,接下來只要把前面定義的模組(Python 程式)放在與當前所執行 Python 程式相同的路徑中(或放在/home/mengma/python_module
路徑下),該模組就能被成功載入了。
在Mac OS X 上設定環境變數
在 Mac OS X 上設定環境變數與 Linux 大致相同(因為 Mac OS X 本身也是類 UNIX 系統)。啟動 Mac OS X 的終端視窗(命令列介面),進入當前使用者的 home 路徑下,然後在 home 路徑下輸入如下命令:
ls -a
該命令將列出當前路徑下所有的檔案,包括隱藏檔案。Mac OS X 平臺的環境變數也可通過,bash_profile 檔案來設定,使用無格式編輯器開啟該檔案,在該檔案中新增 PYTHONPATH 環境變數。也就是為該檔案增加如下一行:
#設定PYTHON PATH 環境變盤
PYTHONPATH=.:/Users/mengma/python_module
Mac OS X 的多個路徑之間同樣以冒號(:)作為分隔符,因此上面一行同樣設定了兩條路徑:點(.)代表當前路徑,還有一條路徑是/Users/mengma/python_module
(memgma 是作者在 Mac OS X 系統的登入名)。
在完成了 PYTHONPATH 變數值的設定後,在 .bash_profile 檔案的最後新增匯出 PYTHONPATH 變數的語句。
#匯出PYTHON PATH 環境變數
export PYTHONPATH
重新登入 Mac OS X 系統,或者執行如下命令:
source.bash_profile
這兩種方式都是為了執行該檔案,使在檔案中設定的 PYTHONPATH 變數值生效。
在成功設定了上面的環境變數之後,接下來只要把前面定義的模組(Python 程式)放在與當前所執行 Python 程式相同的路徑中(或放在Users/mengma/python_module
路徑下),該模組就能被成功載入了。