- BiliBili
- VsCode在使用Python過程中遇到找不到專案模組的問題
問題描述
目錄及程式碼
demo
├─ main.py
└─ src
├─ __init__.py
├─ a.py
└─ b.py
- 在"src/a.py"檔案中有一個方法,程式碼如下
def xxc():
print("hello")
- 在"src/b.py"和"main.py",呼叫"src/a.py"檔案中的"xxc()"方法,程式碼如下
from src.a import xxc
xxc()
報錯內容
- 開啟"src/b.py"檔案",點選VsCode右上角的執行按鈕(Run Python File)執行程式碼
- 報錯如下
Traceback (most recent call last):
File ".../demo/src/b.py", line 1, in <module>
from src.a import xxc
ModuleNotFoundError: No module named 'src'
- 使用命令列執行"src/b.py"檔案呈現同樣結果
$ python src/b.py
# Traceback (most recent call last):
# File ".../demo/src/b.py", line 1, in <module>
# from src.a import xxc
# ModuleNotFoundError: No module named 'src'
- 但是執行根目錄下的"main.py"檔案(完全相同的程式碼),卻沒有任何問題
$ python main.py
# hello
原理及演示
- VsCode的Python專案中,需要顯式地宣告"PYTHONPATH"環境變數
- PYTHONPATH: 用於指定 Python 直譯器在執行 import 語句時搜尋模組或包的路徑
- 下面演示在命令列中,將"PYTHONPATH"環境變數設定為當前專案路徑,解決報錯問題
Windows(CMD)
# 檢視當前目錄
> cd
# E:\code\demo
# 將"PYTHONPATH"設定為當前目錄
> set PYTHONPATH=E:\code\demo
# 執行"src/b.py"檔案
> python src/b.py
# hello
Windows(powershell)
# 檢視當前目錄
> pwd
# Path
# ----
# E:\code\demo
# 將"PYTHONPATH"設定為當前目錄
> $Env:PYTHONPATH="E:\code\demo"
# 執行"src/b.py"檔案
> python src/b.py
# hello
Linux
- 演示如下
- 假設本專案根目錄在"/home/xxc/code/demo"
# 檢視當前目錄
$ pwd
# /home/xxc/code/demo
# 將"PYTHONPATH"設定為當前目錄
$ export PYTHONPATH=/home/xxc/code/demo
# 執行"src/b.py"檔案
$ python src/b.py
# hello
VsCode解決方法
- 在根目錄下建立配置檔案 ".vscode/settings.json",配置內容如下
- 這種方式僅對當前專案有效,想一勞永逸可以設定到全域性配置中
{
"terminal.integrated.env.windows": {
"PYTHONPATH":"${workspaceFolder}"
},
"terminal.integrated.env.osx": {
"PYTHONPATH":"${workspaceFolder}"
},
"terminal.integrated.env.linux": {
"PYTHONPATH":"${workspaceFolder}"
}
}
$ python src/b.py
# hello
VsCode設定技巧
- 設定頁面可以看到兩種級別配置
- User: 使用者(全域性)配置
- Workspace: 工作空間(專案)配置
- 右上角有個圖示,滑鼠懸浮在圖示上可以看到"Open Settings(JSON)",點選開啟對應環境的配置檔案
- VsCode修改配置,實際就是在更新對應的"settings.json"檔案
- 兩種級別的配置實際就是存放在不同位置的"settings.json"檔案
- User: 一般在使用者目錄(Windows一般在C盤)
- Workspace: 就是當前專案的".vscode/settings.json"
- 範圍越小,配置優先順序越高
- 想要一勞永逸,可以將上述配置設定到User使用者全域性配置中
參考文章
- 在VSCode的Python專案中正確地import同專案下其他package中的module
- 重點:VsCode中需要顯式地宣告"PYTHONPATH"
- 該文章中的設定方法較為曲折,不如上述方法方便