根本原因是pycharm运行配置与终端环境不一致:工作目录、pythonpath、sys.path或解释器环境不同,导致模块搜索路径不匹配。

PyCharm 运行时 ModuleNotFoundError 却在终端能跑通
根本原因是 PyCharm 的运行配置和你终端启动 Python 时的 PYTHONPATH / 工作目录 / 模块搜索路径不一致。比如你在终端 cd 到项目根目录再运行 python main.py,Python 自动把当前目录加进 sys.path;但 PyCharm 默认可能以项目根为工作目录,却没把源码目录标记为 source root,导致 from utils import helper 找不到 utils。
实操建议:
PyCharm 2026.2是 JetBrains PyCharm 的指定版本安装包,下载地址指向官方 Windows 安装包直链,可用于旧项目兼容、版本回退和环境测试。
- 右键点击你的源码所在文件夹 → Mark Directory as → Sources Root(变成蓝色图标)
- 检查
File → Settings → Project → Python Console,勾选 Add content roots to PYTHONPATH 和 Add source roots to PYTHONPATH - 确认运行配置里
Working directory是项目根路径,不是某个子目录 - 如果用了相对导入(如
from . import config),确保该文件夹有__init__.py,且你不是直接右键运行该文件(应通过python -m package.module方式)
PyCharm 自动识别成 pytest 导致 import 失败
只要文件名含 test_ 或函数名以 test_ 开头,PyCharm 就可能默认用 pytest 模式运行——此时它不会把当前目录加进 sys.path,也不加载你设的 source root,ImportError 就来了。
实操建议:
- 点
Run → Edit Configurations…→ 左侧选中对应配置 → 右侧看Target类型是不是pytest;如果是,改成Module name或Script path - 全局关闭自动检测:进入
Settings → Tools → Python Integrated Tools→ 把Default test runner改成 Unittests(不是pytest) - 临时绕过:右键文件 →
Run 'main.py'(不是Run 'pytest in main.py'),留意右键菜单第一项的准确文字
虚拟环境里装了包,PyCharm 却提示找不到
常见于你手动用 conda activate env_name 后 pip install,但 PyCharm 没绑定这个环境,或者绑了却缓存了旧的包列表。
实操建议:
- 确认解释器路径:进入
Settings → Project → Python Interpreter→ 看右上角路径是否指向你的 conda env 或 venv 目录(如~/miniconda3/envs/myenv/bin/python) - 点右下角
Show all→ 选中解释器 →Show paths,确认 site-packages 路径和你pip list -v输出的路径一致 - 点右上角
+安装包,或点齿轮图标 →Reload interpreter configuration - 如果刚创建环境就出问题,先在终端激活环境后执行
pip install --upgrade pip,再回 PyCharm 刷新
打包成 exe 后报 ModuleNotFoundError,但 PyCharm 里一切正常
PyInstaller 不会自动扫描 PyCharm 的 source root 或解释器路径,它只认你当前命令行下的 sys.path 和显式指定的 -p 路径。你 PyCharm 里能跑,是因为 IDE 注入了路径;exe 里没有这些注入。
实操建议:
- 打包前,在终端激活你的项目环境,cd 到项目根目录,运行
pyinstaller -F --paths=src -n myapp main.py(把src替换成你实际的源码目录) - 如果用了数据文件或非标准包(如
objprint),加--collect-all objprint - 最稳妥方式:写个
hook-xxx.py放到hooks目录,用Analysis显式添加路径或二进制依赖 - 验证思路:打包后先别运行 exe,用
pyinstaller --debug=all看日志里有没有 warning about missing modules
ModuleNotFoundError)。务必两边都检查一遍。










