You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

最优解决方案(VSCode原生设置)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:46:23