VENV内pip freeze显示已装numpy 运行代码报ModuleNotFoundError
问题根本原因
这个矛盾现象的核心原因非常简单:你运行Python交互环境时调用的解释器,和跑脚本时用的解释器根本不是同一个。
你在激活venv的命令行输python进交互模式时,调用的是虚拟环境目录下的python.exe,这个解释器能正常读取venv里装的numpy,所以导入没问题;但你跑脚本的时候,系统或者编辑器调用了别的位置的Python——绝大多数情况是全局安装的Python,或是其他虚拟环境的解释器,这些解释器的包目录里根本没装numpy,自然会报找不到模块的错。
从你贴的路径还能看到一个容易踩的坑:你的项目里同时存在大小写命名不同的两个文件夹(大写开头的TouristRoutingProblem和全小写的touristroutingproblem),不管是重建venv还是选解释器的时候都容易选错路径,很容易放大这个问题。
分步修复方案
按优先级从高到低挨个试,基本能覆盖所有这类场景:
- 首先修正脚本运行方式:不要直接双击.py文件运行脚本,Windows下双击py文件默认调用系统全局关联的Python解释器,不会走你激活的虚拟环境。激活venv后,在当前命令行窗口中,先切到脚本所在目录,再执行
python TouristRoutingProblem.py运行。可以先在激活的命令行里执行where python,确认输出的第一个路径是你的venv目录下的Scripts\python.exe(比如你当前环境对应的路径应该是C:\Users\User\Desktop\TouristRoutingProblem\touristroutingproblem\my_env\Scripts\python.exe),如果第一个路径是全局Python的安装路径,说明虚拟环境激活未生效。 - 如果你是通过VS Code、PyCharm等代码编辑器运行脚本,手动指定项目的Python解释器为当前venv的解释器:
- VS Code:按
Ctrl+Shift+P调出命令面板,搜索Python: Select Interpreter,在列表中选择指向my_env下Scripts/python.exe的选项,选择完成后重启内置终端再运行脚本。 - PyCharm:打开
Settings > Project > Python Interpreter,点击右上角齿轮图标选择Add,选择Existing environment,浏览选中my_env目录下的python.exe,确认后设置为当前项目的默认解释器即可。
- VS Code:按
- 排查文件名冲突:打开你存放脚本的
00 classes目录,检查有没有自己创建的名为numpy.py的文件,或是名为numpy的文件夹,Python导入包时会优先读取当前工作目录下的同名文件/文件夹,如果存在这类命名,会覆盖官方numpy包的导入逻辑,重命名这类自定义文件/文件夹即可解决。 - 终极验证方案:不依赖虚拟环境激活的环境变量,直接用venv下python.exe的绝对路径运行脚本,示例命令如下:
C:\Users\User\Desktop\TouristRoutingProblem\touristroutingproblem\my_env\Scripts\python.exe "c:\Users\User\Desktop\TouristRoutingProblem\TouristRoutingProblem\00 classes\TouristRoutingProblem.py"
这种方式强制指定使用虚拟环境内的解释器运行,只要numpy确实安装在该venv中,就不会出现模块找不到的错误。
内容的提问来源于stack exchange,提问作者Peek0
相关产品推荐
相关产品推荐

