1. 程式人生 > 其它 >解決模組匯入ModuleNotFoundError: No module named 'XXX'的問題

解決模組匯入ModuleNotFoundError: No module named 'XXX'的問題

想要解決上面的問題,我們需要明確import匯入本質,才好從根上去解決問題。

import匯入本質

通常情況下,當使用 import 語句匯入模組後,Python 會按照以下順序查詢指定的模組檔案:
  • 在當前目錄,即當前執行的程式檔案所在目錄下查詢;
  • 到 PYTHONPATH(環境變數)下的每個目錄中查詢;
  • 到 Python 預設的安裝目錄下查詢。
以上所有涉及到的目錄,都儲存在標準模組 sys 的 sys.path 變數中,通過此變數我們可以看到指定程式檔案支援查詢的所有目錄。換句話說,如果要匯入的模組沒有儲存在 sys.path 顯示的目錄中,那麼匯入該模組並執行程式時,Python 直譯器就會丟擲 ModuleNotFoundError(未找到模組)異常。

解決方式

針對於上述三種查詢模組的方式,對應的給出三種解決方案:

  1. 向 sys.path 中臨時新增模組檔案儲存位置的完整路徑;
  2. 將模組放在 sys.path 變數中已包含的模組載入路徑中;
  3. 設定 path 系統環境變數。

1.臨時新增模組完整路徑

模組檔案的儲存位置,可以臨時新增到 sys.path 變數中。例如想要在D:\XXX\autoCMS_Interface\test_moudle\module2.py模組下匯入D:\XXX\PyCMSDY\test_config的module3.py檔案,注意module2.py和module3.py分別處於另個不同專案中。
sys.path.append(r"D:\XXX\PyCMSDY
\test_config") import module3 print(module3.name)

執行sys.path可以看出"D:\XXX\PyCMSDY\test_config"已經新增到path路徑下。

需要注意的是,通過該方法新增的目錄,只能在執行當前檔案的視窗中有效,視窗關閉後即失效。

2.將模組儲存到指定位置

Python 程式預設的模組載入路徑儲存在 sys.path 變數中,因此,我們可以在module2 .py 程式檔案中先看看 sys.path 中儲存的預設載入路徑,向 say.py 檔案中輸出 sys.path 的值,如下所示:
['D:\\autoCMS_Interface\\test_moudle
', 'D:\\autoCMS_Interface', 'C:\\Program Files\\JetBrains\\PyCharm 2020.2.3\\plugins\\python\\helpers\\pycharm_display', 'C:\\Program Files\\Python37\\python37.zip', 'C:\\Program Files\\Python37\\DLLs', 'C:\\Program Files\\Python37\\lib', 'C:\\Program Files\\Python37', 'C:\\Users\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Program Files\\Python37\\lib\\site-packages', 'C:\\Program Files\\JetBrains\\PyCharm 2020.2.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
上面的執行結果中,列出的所有路徑都是 Python 預設的模組載入路徑,但通常來說,我們預設將 Python 的擴充套件模組新增在 lib\site-packages 路徑下,它專門用於存放 Python 的擴充套件模組和包。 所以,我們可以直接將我們已編寫好的 module3.py 檔案新增到 lib\site-packages 路徑下,就相當於為 Python 擴充套件了一個 module3模組,這樣任何 Python 程式都可使用該模組。

3.設定環境變數

配置環境變數大家就比較熟了,不詳細描述了

4. pycharm自帶方式新增path路徑

除了上述新增環境變數的方式,pycharm還支援Add source roots to PYTHONPATH新增環境變數: 把資料夾Mark Directory as成root就不用手動新增PYTHONPATH了(親測好用),這樣大家看下在匯入的模板的時候發現當前模組的上一級路徑不在環境變數中就可以採用此方式。