Python ImportError 的一种可能原因及其解决方案:以 ImportError: cannot import name ‘_imaging‘ from ‘PIL‘ 为例
标题:Python ImportError 的一种可能原因及其解决方案:以 ImportError: cannot import name ‘_imaging’ from ‘PIL’ 为例先说结论引用一个由 pip install 得到的模块,如果运行时报错 ImportError: cannot import name 'yyyyy' from 'xxxxx' (比如 ImportError:
标题: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
更多推荐
所有评论(0)