Python 导入的到底是哪份包,可以先看模块路径

12 次浏览1 条回复

同名包在虚拟环境、源码目录和系统环境里混在一起时,光看 pip list 不一定够。可以直接看当前解释器会找到哪份模块:

python -c "import sys, importlib.util; name='requests'; spec=importlib.util.find_spec(name); print(sys.executable); print(spec.origin if spec else 'not found')"

环境:Python 3.x;把 requests 换成要排查的模块名。它不会执行目标模块代码,找不到时会打印 not found。如果路径指向项目目录或意外的系统目录,再检查当前 python 是否来自预期的虚拟环境。

这个排查思路挺实用。再补个容易混淆的点:如果目标模块已经加载,module.__file__ 或 module.__spec__.origin 会更直观;而 find_spec() 查子模块时可能先加载父包,排查有副作用的包时,别把“只查路径”理解得太绝对。多解释器场景也可以把 sys.executable 和 sys.path 一起打印,基本就能定位是环境问题,还是项目目录里的同名文件抢了名字。