如果 Python 导入了项目中的文件而非已安装的包,请先确定 Python 正在加载哪个文件。在 macOS 上,检查当前使用的解释器、导入模块的路径,以及项目中是否有同名的文件或文件夹。重命名发生冲突的本地文件,必要时清除其残留的字节码缓存,然后在预期的 Python 环境中运行项目。

1. 检查正在使用的 Python 和模块

在终端(Terminal)中,进入项目文件夹并让 Python 报告模块的来源。将 requests 替换为导致导入失败的名称;例如,安装名为 Pillow 的包,导入时名称为 PIL。

cd "/path/to/your/project"
command -v python3
python3 -c 'import sys, importlib.util; name = "requests"; print("Python:", sys.executable); print("Module:", importlib.util.find_spec(name))'

如果返回结果中的 origin 位于你的项目目录下(例如 .../requests.py),则说明存在本地遮蔽文件。Python 会将脚本所在目录或当前工作目录置于搜索路径的前列,因此同名的本地模块可能会优先于已安装的包被加载。Python 模块搜索路径文档

如果该命令返回 None,则说明该解释器按该名称找不到对应模块。如果它显示的是 site-packages 中的路径,则冲突可能发生在其他地方:你的应用程序可能启动了不同的解释器、导入名称可能与包的安装名称不同,或者错误可能发生在包的依赖项内部。

2. 查找并重命名发生冲突的本地文件

在项目中查找与导入项同名的文件(如 requests.py)或同名目录。同时检查常见的标准库名称,例如 email.py、json.py 或 typing.py。将该文件或目录重命名为项目专用的特定名称,然后更新所有引用了该本地模块的导入语句。避免仅将其重命名为另一个常见包或标准库的名称。

如果该冲突文件确实是项目中需要的模块,请保留它,但赋予它一个独特的名称,并通过项目的包结构来进行导入。与第三方包同名的项目文件极易导致令人困惑的部分导入或缺少属性的错误。

重命名后,如果旧文件旁仍残留有对应的 __pycache__ 目录,仅将其删除即可。Python 通常会自动检查源文件的修改时间并刷新字节码缓存;删除对应的缓存只是清理步骤,不能替代解决名称冲突本身。Python 模块和字节码文档

3. 确保该包属于你运行的 Python 环境

在 macOS 上,系统中存在多个 Python 安装或项目环境是很常见的。sys.executable 显示的可执行文件就是你刚刚运行命令所使用的解释器。通过该解释器安装包,以避免 pip 和 Python 意外指向不同的环境:

python3 -m pip show requests
python3 -m pip install requests

在使用 pip show 时使用包的分发名称,而在 Python 中使用其导入名称。两者可能不同;例如,Pillow 通常以 PIL 的形式导入。如果 pip show 返回“package not found”,则表示该命令所使用的解释器尚未安装该分发包。

对于项目专用的环境,请在项目目录下创建并激活虚拟环境,然后在其中安装依赖项:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install requests
python -c 'import requests; print(requests.__file__)'

激活环境后,python 应会解析为该环境对应的解释器。最后一条命令会打印出实际加载的文件路径;请检查该路径是否位于 .venv 下,而不是项目的顶层目录。虚拟环境可以将项目包与其他环境隔离开来,可以使用 python -m venv 进行创建。Python venv 文档

4. 检查路径覆盖并全新重试

如果模块仍解析到非预期的位置,请检查 Python 的搜索路径以及任何 PYTHONPATH 覆盖设置:

python -c 'import os, sys; print("PYTHONPATH:", os.environ.get("PYTHONPATH")); print("sys.path:"); print("\n".join(sys.path))'

sys.path 是使用 PYTHONPATH 和依赖于安装的默认设置进行初始化的;在常见的调用中,Python 还会将脚本目录或当前工作目录前置到该路径中。使用 unset PYTHONPATH 从当前 shell 中移除不必要的 PYTHONPATH 设置,然后重新运行诊断。如果存在持久设置,请检查设置了该变量的 shell 启动文件,并删除或更正该导出命令。Python sys.path 文档

重命名文件或更改环境后,请重启 Python 进程:正在运行的解释器可能会将已导入的模块保留在内存中。然后重复进行来源检查,并按常规方式运行命令或应用程序。如果来源正确但导入仍然失败,请阅读完整的回溯信息(traceback);这可能是缺少依赖项或包在加载时引发了错误,而非名称冲突。

来源