一個python項目,會有多個模塊,這樣既便于開發(fā)也利于后期維護。然而有時候我們需要單獨對某個模塊進行測試,我在其中一個模塊導入另一個模塊的時候,出現(xiàn)了
ModuleNotFoundError: No module named
明明包的路徑并沒有問題啊,導入的語句也沒錯誤,怎么就這樣了呢?
我要做下說明,該項目使用vscode開發(fā),該問題僅出現(xiàn)在項目中多個自定義模塊的相互調用時出現(xiàn),在使用主程序:setup.py調用則沒有報錯,而同樣的項目在pycharm中則沒有出現(xiàn)import不了的情況。
我的直覺就是:import的模塊肯定是沒有被python搜索到。
要解決這個問題,需要了解下python的搜索路徑,默認情況下python會搜索環(huán)境變量:path 和PYTHONPATH 這兩個變量,當前項目路徑必須包含在這兩個變量任意一個才可以被搜索到,是不是這個問題呢?看看才知道,我使用python代碼,打印了一下這兩個變量,得到如下結果:
import sys import os print(f"PATH:{sys.path}") print(f"PYTHONPATH:{os.environ.get('PYTHONPATH')}" )
發(fā)現(xiàn)path路徑中只包含了該python文件所在目錄,PYTHONPATH路徑則返回 None
PS E:\xx\ui> python .\ui\ui_proxy.py PATH:['E:\\xx\\ui', 'D:\\Programs\\Python\\Python38\\python38.zip', 'D:\\Programs\\Python\\Python38\\DLLs', 'D:\\Programs\\Python\\Python38\\lib', 'D:\\Programs\\Python\\Python38', 'C:\\Users\\fedke\\AppData\\Roaming\\Python\\Python38\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32\\lib', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\Pythonwin'] PYTHONPATH:None
項目目錄:E:\xx\ 并沒有在path和PYTHONPATH路徑里,難怪找不到模塊,順便提一句:pycharm已經自動完成了這個步驟,將項目路徑添加到了path和PYTHONPATH兩個變量中,因此是可以相互調用的。
PATH:['E:\\xx\ui', 'E:\\xx', 'D:\\Programs\\Python\\Python38\\python38.zip', 'D:\\Programs\\Python\\Python38\\DLLs', 'D:\\Programs\\Python\\Python38\\lib', 'D:\\Programs\\Python\\Python38', 'C:\\Users\\fedke\\AppData\\Roaming\\Python\\Python38\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32\\lib', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\Pythonwin'] PYTHONPATH:C:\xx
知道了問題產生的原因,修復起來也很簡單,本文將列出兩種方法。
方法一、將項目路徑添加到環(huán)境變量Path里,在需要調用的模塊最頂部添加代碼:
# coding=utf-8 import sys import os sys.path.append(os.getcwd())
這個就不會再報錯了,程序順利運行。
然而這種方法也有弊端,需要每次都要添加,比較麻煩,有沒有更簡單的方法呢?當然是有的,我們來看第二個方法。
方法二、修改vscode配置文件,將項目目錄添加到PYTHONPATH中
打開vscode的settings.json文件,添加以下配置:
// 將項目自動添加到PYTHONPATH路徑,避免import模塊找不到 "terminal.integrated.env.osx": { "PYTHONPATH": "${workspaceFolder}", }, "terminal.integrated.env.linux": { "PYTHONPATH": "${workspaceFolder}", }, "terminal.integrated.env.windows": { "PYTHONPATH": "${workspaceFolder}", },
該配置是臨時添加,不會影響系統(tǒng)中設置的環(huán)境變量,僅在當前環(huán)境中可用,非常方便。
重啟下vscode,再次打印path和PYTHONPATH
PATH:['E:\\XX\\ui', 'E:\\XX', 'D:\\Programs\\Python\\Python38\\python38.zip', 'D:\\Programs\\Python\\Python38\\DLLs', 'D:\\Programs\\Python\\Python38\\lib', 'D:\\Programs\\Python\\Python38', 'C:\\Users\\fedke\\AppData\\Roaming\\Python\\Python38\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\win32\\lib', 'D:\\Programs\\Python\\Python38\\lib\\site-packages\\Pythonwin'] PYTHONPATH:E:\XX
path和PYTHONPATH中都有項目根路徑了,沒有再報錯了,界面出來了:
大功告成,通過文中的方法,現(xiàn)在項目中的模塊可以正常import了。