想要解決上面的問題,我們需要明確import導入本質,才好從根上去解決問題。
import導入本質
通常情況下,當使用 import 語句導入模塊后,Python 會按照以下順序查找指定的模塊文件:
- 在當前目錄,即當前執行的程序文件所在目錄下查找;
- 到 PYTHONPATH(環境變量)下的每個目錄中查找;
- 到 Python 默認的安裝目錄下查找。
以上所有涉及到的目錄,都保存在標准模塊 sys 的 sys.path 變量中,通過此變量我們可以看到指定程序文件支持查找的所有目錄。換句話說,如果要導入的模塊沒有存儲在 sys.path 顯示的目錄中,那么導入該模塊並運行程序時,Python 解釋器就會拋出 ModuleNotFoundError(未找到模塊)異常。
解決方式
針對於上述三種查找模塊的方式,對應的給出三種解決方案:
- 向 sys.path 中臨時添加模塊文件存儲位置的完整路徑;
- 將模塊放在 sys.path 變量中已包含的模塊加載路徑中;
- 設置 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了(親測好用),這樣大家看下在導入的模板的時候發現當前模塊的上一級路徑不在環境變量中就可以采用此方式。
