VSCode venv环境中运行内部脚本出现ModuleNotFoundError的问题咨询
当运行src/inner_main.py时,VSCode默认的工作目录是当前文件所在的src/目录,而非项目根目录PJFOLDER。Python会把运行时的工作目录加入sys.path,此时sys.path里没有项目根,自然找不到同级的utils模块;而outer_main.py在根目录运行,工作目录就是根,所以导入正常。用python -m src.inner_main能运行,是因为-m参数会把执行命令时的当前目录(项目根)作为包的起始路径加入sys.path。
1. 配置运行/调试的工作目录
通过launch.json指定运行时的工作目录为项目根,一劳永逸解决所有文件的导入问题:
- 打开
inner_main.py,按F5启动调试,首次运行会自动生成.vscode/launch.json - 修改配置,添加
"cwd": "${workspaceFolder}",示例如下:
{ "version": "0.2.0", "configurations": [ { "name": "Python: Current File", "type": "python", "request": "launch", "program": "${file}", "console": "integratedTerminal", "cwd": "${workspaceFolder}" // 强制工作目录为项目根 } ] }
之后不管用Ctrl+F5还是调试功能运行任何文件,工作目录都是项目根,sys.path会包含PJFOLDER,from utils import my_utils就能正常识别。
2. 规范项目包结构(可选)
给src/和utils/目录添加空的__init__.py文件,让Python把它们识别为正式包:
PJFOLDER ├── .venv/* ├── src/ │ ├── __init__.py │ └── inner_main.py ├── utils/ │ ├── __init__.py │ └── my_utils.py └── outer_main.py
这一步能优化VSCode的类型检查和代码提示,和工作目录配置配合使用效果更好。
sys.path的疑惑 Python在脚本模式下(直接python src/inner_main.py),会把脚本所在的目录(src/)加入sys.path,而非执行命令时的当前目录。VSCode默认运行单个文件时就是这种脚本模式,所以sys.path里没有项目根。而import_fix.py里的os.getcwd()取的是VSCode终端的当前目录(如果终端在项目根),所以能临时把根目录加入路径,但这个方案依赖终端的工作目录,不如直接配置launch.json稳定。
内容的提问来源于stack exchange,提问作者Eugene

