导入错误: 无法导入名称_imaging

87

我安装了Pillow,现在我想要:

from PIL import Image

我遇到了以下错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 61, in <module>
ImportError: cannot import name _imaging

然而,如果我单独导入这些内容,一切都很好,也就是说:
import _imaging
import Image

你知道问题可能是什么吗?


如果使用AWS Lambda,我在这里发布了一个解决方案,不需要Docker。您只需创建一个层,诀窍是您在本地拥有正确版本的Python,如果需要,可以安装它。https://dev59.com/XFcO5IYBdhLWcg3wpTKW#74736780 - MattC
16个回答

95

我遇到了同样的问题,通过使用以下命令升级此软件包来解决了这个问题:

pip install -U Pillow

55
如果您在一个操作系统中构建了Pillow,然后将site-packages的内容复制到另一个操作系统中,也会出现这种情况。例如,如果您正在创建AWS Lambda部署包,那么在运行Lambda函数时就会遇到此错误。如果是这种情况,那么需要在Amazon Linux实例中安装Pillow,并在部署包中使用生成的site-packages。请参见以下说明和详细信息:http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html

1
我将CodeBuild与Elastic Container Repository结合使用。ECR用于存储CodeBuild使用的Docker镜像。我之前使用的是基于python:3.5.2镜像的镜像,但出现了错误信息。一旦我切换到amazonlinux:latest并在其中手动安装Python,问题就得到解决。非常感谢您的见解! - JonathanGailliez
很高兴能帮到你 :) - joarleymoraes
5
这是否意味着我不能在我的 Mac 上创建包含正确内容的 zip 文件? - blogbydev
这个解决方案对我不起作用,因为我正在尝试使用嵌入式Python zip创建便携式应用程序。Pip似乎在嵌入式Python中也不再起作用,因此我也无法通过嵌入式解释器安装。 - Lost Crotchet
1
这正是我的问题,我用以下这行代码解决了它,在将代码压缩并上传到 Lambda 之前在我的 Mac 上运行:pip install --platform=manylinux2014_x86_64 --only-binary=:all: --target lambda_env/lib/python3.9/site-packages pillow - ChrisDanger
显示剩余2条评论

42

我也遇到了这个问题。如果您安装了PIL,并在其之上安装了Pillow,则可能会出现此问题。

前往 /usr/local/lib/python2.7/dist-packages/ 并删除名称中包含"PIL"(包括目录)的任何内容。如果存在 Pillow .egg 文件,您也可以将其删除。 然后重新安装Pillow。

将"python2.7"替换为您正在使用的Python版本。


1
在我的 Mac 上,我必须在 /usr/local/lib/python2.7/site-packages 下进行这个操作。已解决,谢谢。 - Nick
1
在Ubuntu上,我运行了“sudo pip3 uninstall uninstall pip3” 4次(因为总是还有东西要删除),直到没有任何东西可删除。然后运行“pip3 install -U pillow --user”,Pillow就不再出现错误了。 - alexexchanges
4
卸载Pillow库: pip uninstall pillow重新安装Pillow库: pip install pillow这就足够了。 - zzfima
谢谢你帮我找到了解决方案。在Ubuntu 16.04中,我在运行Python3时遇到了问题。对我来说,只需要删除“官方”软件包python3-pil(即sudo apt-get remove python3-pil)就足够了,因为我已经通过pip安装了Pillow - loved.by.Jesus
1
卸载并重新安装pillow完美解决了问题。pip uninstall pillow pip install -U pillow - Naresh Kumar

5

你的pillow版本是多少?

enter image description here

Pillow >= 2.1.0 不再支持 import _imaging。请改用 from PIL.Image import core as _imaging这里是官方文档。


我在PIL\Image.py中进行了编辑,使用了from PIL.Image import core as _imaging,但出现了异常值:无法导入名称'core'。 - CristiC777

4

我用Python 3.6也遇到了相同的错误,升级Pillow插件解决了问题。

sudo python3.6 -m pip install Pillow --upgrade

如果使用其他版本的Python,请使用您的版本代替3.6。


2

如果您在Linux环境下运行安装在Mac上的Pillow(例如,在Mac上构建AWS Lambda,然后将其部署到Linux运行时),则可能会出现此问题。

要确保您正在为正确的平台安装它,请执行以下操作:

pip3 install --platform manylinux1_x86_64 --only-binary=:all:
--only-binary=:all: 是在指定 --platform 时所必需的,平台本身可以在https://pypi.org/project/Pillow/7.2.0/#files(例如)中找到 - 平台是文件名的最后一部分,例如 win32、manylinux1_x86_64、manylinux1_i686 等等。

这样就避免了需要运行 Linux 才能安装 Pillow 的 Linux 构建版本的需求。


1
你还应确保pip3引用了正确的Python版本。如果你的Lambda函数是Python3.8,最好使用pip3.8 - mustafa

2

只需卸载pillow

pip uninstall pillow

然后再次安装pillow
pip install pillow

非常好用


1

为了让Pillow工作,必须将PIL放在/usr/local/lib/python2.7或3/dist-packages/PIL.py中。

在dist-packages中,PIL.py应该有一个文件夹。

  1. sudo apt-get update
  2. pip install Pillow

PIL != PiL


顺便说一下,PIL确实有一个文件夹,在/usr/local/lib/python2.7/dist-packages/PIL下。 - tomooka
导入PIL而不是导入PiL。 - James Paul Shaulis
兄弟,就像我说的,PiL 是一个打字错误。最初我导入了 PIL :D,但仍然不起作用。 - tomooka
尝试使用Python3导入PIL。 - James Paul Shaulis

1

这可能是一个小众的解决方案,但我在Pycharm上解决了这个问题,方法是进入文件->设置->Python解释器,然后点击pillow软件包旁边的升级符号。


1
当我尝试部署lambda包时也遇到了同样的问题,问题在于必须预编译包以模拟要使用的lambda架构/运行时,否则你会得到“无法导入名称_imaging”的错误。解决此问题有两种方法:
1-启动一个EC2 Amazon Linux实例。(我只讨论这个方法)
2-使用docker。

简短解决方案

  1. 在 Amazon Linux 2 实例中安装 Python 3。(必须是您计划在 Lambda 中使用的 python3.X 版本)
  2. 在 ec2-user 主目录下安装虚拟环境。
  3. 激活环境,然后安装 Boto 3。
  4. 安装 Pillow。
  5. 创建一个 ZIP 归档文件,其中包含库(PIL 和 Pillow.libs)的内容。
  6. 将您的函数代码添加到归档文件中。
  7. 更新您的 Lambda。(AWS CLI)

长解决方案

  1. 如果尚未安装Python 3,则使用yum软件包管理器安装该软件包。
`$ sudo yum install python3 -y`
  1. 在 ec2-user 主目录下创建一个虚拟环境
The following command creates the app directory with the virtual environment inside of it. You can change my_app to another name. If you change my_app, make sure that you reference the new name in the remaining resolution steps.

`$ python3 -m venv my_app/env`
  1. 激活虚拟环境并安装Boto 3

将适当的权限策略与AWS Identity and Access Management (IAM)角色附加到您的EC2实例,以便Boto 3可以与AWS APIs进行交互。对于其他身份验证方法....为了快速使用,您可以使用 $ aws confifure 查看文档 设置您的凭据(在步骤7中需要)

3.1 通过在项目目录下的bin目录中的activate文件中运行源代码来激活环境。

  `$ source ~/my_app/env/bin/activate`

3.2. 确保您的环境中已安装最新的pip模块。 $ pip install pip --upgrade

3.3 使用pip命令在虚拟环境中安装Boto 3库。

   `pip install boto3`
  1. 使用pip安装库。

    $ pip install Pillow

4.1 取消虚拟环境。

 `$ deactivate`
  1. 创建一个包含库内容的ZIP归档文件。

    切换到pip安装的目录,应该类似于/my_app/env/lib/python3.x/site-packages。

重要提示:关键在于将site-packages中的文件压缩成lambda所需的文件。(我只使用了PIL和Pillow.libs以节省空间,但你可以压缩所有文件)

5.1 压缩PIL文件夹中的所有内容。

   `zip -r9 PIL.zip ./PIL/`

   add the Pillow.libs to your ZIP

   `zip -gr PIL.zip Pillow.libs`
  1. Add your function code to the archive.
    you can do this in the console if it just on file of code, but i recomend doing it in this step.If you don't have your code,just create a file using vi or nano and save it with the name that your lambda handler will use (in this case will use lambda_function.py).
    
    `zip -g PIL.zip lambda_function.py`
    
  2. Update your the lambda.(AWS CLI) if you haven't create a lambda function,do it now before updating the function from the aws cli, make sure that you have the right permission to update lambda from the aws cli.

    change LAMBDAFUNCTIONNAME for your function name

    aws lambda update-function-code --function-name LAMBDAFUNCTIONNAME P --zip-file fileb://PIL.zip

走出第一个循环地狱

前往您的Lambda控制台并测试您的代码,请确保使用与EC2实例中使用的相同的运行时/Python版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接