标题:Python ImportError 的一种可能原因及其解决方案:以 ImportError: cannot import name ‘_imaging’ from ‘PIL’ 为例

先说结论

引用一个由 pip install 得到的模块,如果运行时报错 ImportError: cannot import name 'yyyyy' from 'xxxxx' (比如 ImportError: cannot import name '_imaging' from 'PIL'),可以去安装包的路径 Lib/site-packages/xxxxx 里面看有没有文件名如 yyyyy.cp数字-win_amd64.pyd 的文件。

如果真的有,但 cp数字 与当前 Python 版本号不对应,那就说明【当前包的版本】与 【Python 版本】不对应。只需 pip install 时补上两个参数 --python-version (你的Python版本号)--no-deps 再重新下载(可再加上 --upgrade --force-reinstall 把旧版本的包覆盖掉)即可。

pip install --upgrade --force-reinstall pillow  --python-version 3.8  --no-deps

然后观察重新下载的文件名里的 cp数字 是不是对的(一般就是对的了)。

对于 PIL 等一部分包,还要留意新安装的路径有没有嵌套(比如变成 Lib/site-packages/PIL/PIL),如果有那就纠正过来(手动移动一下文件)。

问题复现:Python 3.8 import PIL

说明:为了演示,我新开了一个 conda 环境来操作。

我开了两个终端

  • 一个是 Anaconda Prompt,主要用来执行 conda 相关的命令;
  • 一个是 Windows 10 自带的命令行,主要用来执行 pip 相关的命令。

然后用 PyCharm,运行一段代码去执行 from PIL import Image

1 准备环境

【Anaconda Prompt】conda create -n reproduce_PIL python=3.8

【Anaconda Prompt】conda activate reproduce_PIL

【Anaconda Prompt】conda info,输出:

前面很多行,略
envs directories: (在这里可以查看 conda 环境的包的下载绝对路径)
后面很多行,略

那么,我们接下来要下载的包的路径就是 (上述绝对路径)\reproduce_PIL\Lib\site-packages,以下简称 “根目录”。

【Windows Cmd】cd (根目录)

【PyCharm】打开一个新的工程,File > Settings... > Project: xxx > Project Interpreter,把刚才新建的 conda 环境 reproduce_PIL 添加到 PyCharm 并应用于此工程,并新建代码 A.py 如下:

from PIL import Image
print(Image.MAX_IMAGE_PIXELS)

运行 A.py,输出报错:

ModuleNotFoundError: No module named 'PIL'

2 安装 pillow 失败

【Windows Cmd】pip install pillow --target . -i https://pypi.mirrors.ustc.edu.cn/simple,输出:

Successfully installed pillow-8.3.1

注:当前思路是用 pip 往一个 conda 环境里去下载包,所以加上 target .;其中 . 表示当前路径,因为我们刚才已经 cd 到 “根目录” 了。

【PyCharm】再次运行 A.py,报错:

Traceback (most recent call last):
  File "(略)/A.py", line 2, in <module>
    from PIL import Image
  File "(略)\envs\reproduce_PIL\lib\site-packages\PIL\Image.py", line 114, in <module>
    from . import _imaging as core
ImportError: cannot import name '_imaging' from 'PIL' ((略)\envs\reproduce_PIL\lib\site-packages\PIL\__init__.py)

3 找到问题

既然找不到 _image,那我们可以去之前说的下载路径 “根目录” 里看有没有对应模块。进入 PIL 子目录,发现文件名以 _imaging. 开头的只有 _imaging.cp39-win_amd64.pyd

在这里插入图片描述

这个 cp39 暗示我们,我们没有装上当前 conda 环境所用的 Python 3.8 的对应文件。

于是我们为刚才的 pip install 补上参数 --python-version 3.8;并根据报错再补一个参数 --no-deps。最终的命令是这样:

【Windows Cmd】pip install --upgrade --force-reinstall pillow --target . -i https://pypi.mirrors.ustc.edu.cn/simple --python-version 3.8 --no-deps

Successfully installed pillow-8.3.1

注意到,这次我们得到了 _imaging.cp38-win_amd64.pyd,可以用于 Python 3.8 了。但安装的路径(Lib\site-packages\PIL\PIL)有点奇怪,嵌套了两层 PIL

在这里插入图片描述

所以我手动把里面一层的文件全部移动到外面一层。或者,不想移动文件的话,就把代码改为 from PIL.PIL import Image

【PyCharm】再次运行 A.py,成功输出。

89478485

Process finished with exit code 0
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐