配置vscode+blender
直接使用blender中的text editor沒有代碼補全,終端輸出通常和blender不在同一個頁面,只適合非常簡單的代碼測試。使用Vscode能有效提高blender調試的效率,具體方式見:VSCode 開發 Blender腳本工具配置。
調試進階版(包含遇到的一些錯誤的解決方法)
一般來說,調試步驟是這樣的:
- Ctrl+shift+P 選擇
Blender: Start
,然后選擇你的blender的exe路徑 - Ctrl+shift+P 選擇
Blender: Run Scrip
(如果你寫好腳本的話,也就是.py文件)
但是上面的步驟看起來只適合單個文件,如果你需要對非常大型的項目進行調試的話,執行上面的步驟非常可能出錯。
錯誤1:無法識別模塊
File "D:\Software\blender-3.6.18-windows-x64\3.6\python\lib\runpy.py", line 96, in _run_module_code_run_code(code, mod_globals, init_globals,File "D:\Software\blender-3.6.18-windows-x64\3.6\python\lib\runpy.py", line 86, in _run_codeexec(code, run_globals)File "e:\temp\scene\main.py", line 3, in <module>from membank.utils.f import download_assets
ModuleNotFoundError: No module named 'membank'
Location: D:\Software\blender-3.6.18-windows-x64\3.6\scripts\modules\bpy\ops.py:111
這里 membank
是用戶自定義的模塊(也就是包含__init__.py
文件的一個文件夾),但是在執行 Blender: Run Scrip
后無法檢測到,原因是:Blender 自帶了一套 Python 解釋器(這里的是 D:\Software\blender-3.6.18-windows-x64\3.6\python\bin\python.exe
),它和系統里的 Anaconda / Miniconda 或其他 Python 環境是隔離的。
解決方法:
將本地代碼(通常是你run script時的那個腳本)加入 sys.path
import syssys.path.append('membank目錄的上級目錄')from membank.xxxx import yyy # 正常導入
錯誤2:無法檢測到xxx包(python環境)
File "e:\temp\scene\main.py", line 6, in <module>from membank.utils.f import download_assetsFile "E:\temp\scene\membank\utils\f.py", line 4, in <module>from membank.utils.pipeline import PipelineContextFile "E:\temp\scene\membank\utils\pipeline.py", line 6, in <module>from tqdm import tqdm
ModuleNotFoundError: No module named 'tqdm'
Location: D:\Software\blender-3.6.18-windows-x64\3.6\scripts\modules\bpy\ops.py:111
這個問題的核心是:
ModuleNotFoundError: No module named 'tqdm'
也就是說,Blender 自帶的 Python 環境中 沒有安裝 tqdm
模塊(一個常用的進度條庫),所以你的腳本在導入時失敗了。
? 為什么會出現這種情況?
Blender 內部使用的是 獨立的 Python 解釋器,它和你用 Conda、Pyenv、系統 Python 是隔離的。你平常在 VSCode 里 pip install tqdm
安裝的模塊,并不會自動出現在 Blender 的 Python 中。
? 解決方案:在 Blender 的 Python 環境里安裝 tqdm
🧩 步驟如下:
-
打開 CMD 或 PowerShell
-
進入 Blender 的 Python 路徑(3.6 目錄下)
通常在這個路徑下:
D:\Software\blender-3.6.18-windows-x64\3.6\python\bin\python.exe
- 安裝 pip(如果還沒安裝)
D:\Software\blender-3.6.18-windows-x64\3.6\python\bin\python.exe -m ensurepip
- 用 Blender 的 Python 安裝 tqdm
D:\Software\blender-3.6.18-windows-x64\3.6\python\bin\python.exe -m pip install tqdm
錯誤3:參數錯誤(argparse解析錯誤)
Got POST: {'type': 'script', 'path': 'e:\\temp\\scene\\main.py'}
127.0.0.1 - - [17/Jul/2025 00:12:54] "POST / HTTP/1.1" 200 -
看起來我已經成功發送了請求 但是沒有任何響應,連打印的結果都沒有出現
你這邊遇到的情況是:Blender 調用了你的 main.py
,但是沒有任何輸出,甚至 print()
的內容也沒有出現。這通常有以下幾種可能原因:
? 1. 腳本邏輯本身沒有進入你以為執行的部分
例如你寫了:
if __name__ == '__main__':print("Hello")
??在 Blender 中通過 runpy.run_path()
執行腳本時,__name__ != '__main__'
,所以這段代碼不會運行!
? 正確做法
你應該把你要執行的內容,直接放到腳本的頂層或者函數中,例如:
def main():print("This is running in Blender")main()
? 2. Blender 執行了腳本,但被某個隱藏的錯誤中斷了
這時不會有明顯錯誤信息,除非你加上調試或 try-except。
如果哪一步失敗了,打印的信息可以幫你定位。
? 3. args
根本沒傳入,或者你在頂層用到了 argparse
Blender 運行 .py
腳本不會傳遞 sys.argv
給你像 argparse
那樣使用。
如果你有類似:
args = parser.parse_args()
這在 Blender 中通常不會得到你期望的參數。
你遇到的錯誤是:
main.py: error: unrecognized arguments: --python c:\Users\ASUS\.vscode\extensions\jacqueslucke.blender-development-0.0.25\pythonFiles\launch.py
? 問題本質:
你的 main.py
使用了 argparse
解析命令行參數:
parser = argparse.ArgumentParser()
args = parser.parse_args()
但是在 Blender 中通過 VSCode 插件運行 Python 腳本時,它會自動向你的腳本傳入一堆你 沒有定義的參數,例如:
--python c:\xxx\launch.py
于是 argparse
報錯:unrecognized arguments
? 解決方案:不要用 argparse
,而是手動構造參數類
最推薦用于 Blender 調試:
class Args:json = "scene_json/6.json"output_dir = "output/6"input_image = ""input_text = ""input_scene = "scene_json/6.json"wall_height = 3.2export_glb = Falseargs = Args()
然后直接調用你的主函數:
test_export2blender(args)
這樣你在 VSCode + Blender 插件調試中,就能看到逐步輸出和錯誤信息了。
不過except Exception as e: print("Exception occurred:", e)
這種寫法無法顯示具體是哪一行代碼出錯。
為了 在 VSCode + Blender 插件中調試時獲得詳細錯誤信息,你可以使用 traceback 模塊來打印完整的異常棧信息。
import tracebackdef main():print("Start script inside Blender")class Args:json = "scene_json/6.json"output_dir = "output/6"input_image = ""input_text = ""input_scene = "scene_json/6.json"wall_height = 3.2export_glb = Falseargs = Args()try:test_export2blender(args)print("Script completed successfully.")except Exception as e:print("Exception occurred:")traceback.print_exc()