VSCode直接运行manage.py失败,因其默认将其当作普通Python脚本执行,不触发Django命令解析逻辑;必须配置"module":"django"、"args":["runserver","--noreload"]和"env":{"DJANGO_SETTINGS_MODULE":"myproject.settings"},才能正确启动并支持断点调试。

VSCode里用manage.py启动Django,为什么直接双击或右键运行会失败
因为VSCode默认把manage.py当普通Python脚本执行,不走Django的命令解析器逻辑。它不会加载DJANGO_SETTINGS_MODULE,也不会识别runserver这类子命令——结果就是报ModuleNotFoundError: No module named 'django',或者直接闪退没输出。
真正起作用的是python -m django或python manage.py被Django内部的execute_from_command_line()接管。VSCode必须明确告诉它:“这是Django命令,不是随便一个.py文件”。
- 别在资源管理器里右键
manage.py→ “Run Python File”,这等价于python manage.py裸跑,缺环境、缺设置、断点无效 - 不要在终端里手动敲
python manage.py runserver后就以为“已集成”——这只是临时命令,和VSCode调试器无关 - 确保
manage.py所在目录是项目根目录(即含settings.py的子目录同级),否则__import__找不到配置模块
launch.json里怎么配manage.py参数才生效
关键不是“能不能传参”,而是“谁来解析这些参数”。program字段交给Python解释器直执行,module字段才交给Django框架调度。所以必须用"module": "django",再通过args把参数喂给Django自己的命令行入口。
-
"module": "django"—— 强制VSCode调用python -m django,让Django接管后续流程 -
"args": ["runserver", "8000", "--noreload"]——--noreload必须加,否则Django fork子进程,调试器附着不到主进程,断点全失效 -
"env": {"DJANGO_SETTINGS_MODULE": "myproject.settings"}—— 值必须是Python模块路径(如myproject.settings),不能写成文件路径(如myproject/settings.py) - 如果项目结构是
src/myproject/套一层,需额外加"cwd": "${workspaceFolder}/src",否则manage.py找不到myproject包
想动态改端口或加--insecure,怎么避免每次改launch.json
硬编码在args里太僵硬,尤其多人协作时容易冲突。VSCode支持input变量注入,让每次启动前交互输入参数,既灵活又不污染配置文件。
- 在
launch.json顶层加"inputs"字段,定义一个port输入项:"inputs": [{ "id": "port", "type": "promptString", "description": "Enter port number", "default": "8000" }] - 把
args改成:["runserver", "${input:port}", "--noreload"] - 启动调试时会弹框让你输端口,输
8080就跑runserver 8080,输0.0.0.0:8000也支持 - 注意:
--insecure不能靠输入变量加,得写死在args里——因为它是布尔开关,不是值参数;如果常用,可另建一个独立的launch配置项
为什么manage.py里改了argv也没用
你在manage.py开头加sys.argv.extend(['runserver', '8000']),本地终端能跑,但VSCode调试时依然报错——这是因为VSCode根本没执行manage.py的代码体,它只读取#!/usr/bin/env python头,然后按module或program字段决定怎么加载。
- 选
"module": "django"时,VSCode跳过manage.py,直接执行django.core.management.execute_from_command_line() - 选
"program": "./manage.py"时,虽会执行文件,但此时sys.argv已被VSCode重写为['manage.py'],你硬塞的参数早被覆盖 - 唯一可控入口是
launch.json的args字段,其他地方改都是徒劳
最易被忽略的点:很多人以为manage.py是Django项目的“启动器”,其实它只是个薄包装;真正调度命令的是django.core.management模块。VSCode调试器只认这个模块,不认manage.py里的任何逻辑。


















