很多初學者經常遇到這樣的問題,即自定義 Python 模板後,在其它文件中用 import(或 from…import) 語句引入該文件時,Python 解釋器同時如下錯誤:
ModuleNotFoundError: No module named ‘模塊名’
意思是 Python 找不到這個模塊名,這是什麼原因導致的呢?要想解決這個問題,讀者要先搞清楚 Python 解釋器查找模塊文件的過程。
通常情況下,當使用 import 語句導入模塊後,Python 會按照以下順序查找指定的模塊文件:
以上所有涉及到的目錄,都保存在標准模塊 sys 的 sys.path 變量中,通過此變量我們可以看到指定程序文件支持查找的所有目錄。換句話說,如果要導入的模塊沒有存儲在 sys.path 顯示的目錄中,那麼導入該模塊並運行程序時,Python 解釋器就會拋出 ModuleNotFoundError(未找到模塊)異常。
解決“Python找不到指定模塊”的方法有 3 種,分別是:
不過,在詳細介紹這 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 環境變量。
首先,找到桌面上的“計算機”(或者我的電腦),並點擊鼠標右鍵,單擊“屬性”。此時會顯示“控制面板\所有控制面板項\系統”窗口,單擊該窗口左邊欄中的“高級系統設置”菜單,出現“系統屬性”對話框,如圖 1 所示。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-to5XHniU-1656314615077)(https://editor.csdn.net/uploads/allimg/190221/2-1Z22114355J96.gif)]
圖 1 系統屬性對話框
如圖 1 所示,點擊“環境變量”按鈕,此時將彈出圖 2 所示的對話框:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-n3sQSoZ1-1656314615087)(https://editor.csdn.net/uploads/allimg/190221/2-1Z22114361X93.gif)]
圖 2 環境變量對話框
如圖 2 所示,通過該對話框,就可以完成 path 環境變量的設置。需要注意的是,該對話框分為上下 2 部分,其中上面的“用戶變量”部分用於設置當前用戶的環境變量,下面的“系統變量”部分用於設置整個系統的環境變量。
通常情況下,建議大家設置設置用戶的 path 變量即可,因為此設置僅對當前登陸系統的用戶有效,而如果修改系統的 path 變量,則對所有用戶有效。
對於普通用戶來說,設置用戶 path 變量和系統 path 變量的效果是相同的,但 Python 在使用 path 變量時,會先按照系統 path 變量的路徑去查找,然後再按照用戶 path 變量的路徑去查找。
這裡我們選擇設置當前用戶的 path 變量。單擊用戶變量中的“新建”按鈕, 系統會彈出如圖 3 所示的對話框。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7nME01Gi-1656314615088)(https://editor.csdn.net/uploads/allimg/190221/2-1Z221143645404.gif)]
圖 3 新建PYTHONPATH環境變量
其中,在“變量名”文本框內輸入 PYTHONPATH,表明將要建立名為 PYTHONPATH 的環境變量;在“變量值”文本框內輸入 .;d:\python_ module
。注意,這裡其實包含了兩條路徑(以分號 ;作為分隔符):
d:\python_ module
,當運行 Python 程序時,Python 將可以從 d:\python_ module
中加載模塊。然後點擊“確定”,即成功設置 path 環境變量。此時,我們只需要將模塊文件移動到和引入該模塊的文件相同的目錄,或者移動到 d:\python_ module
路徑下,該模塊就能被成功加載。
啟動 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 上設置環境變量與 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
路徑下),該模塊就能被成功加載了。