Import Error: 无法导入 name_image

我安装了 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

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

119009 次浏览

枕头的工作 PIL 必须在 /usr/local/lib/python2.7 or3/dist-packages/PIL.py

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

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

= PiL

我也遇到了这个问题。这可能发生,如果你有 PIL 安装,然后安装枕头在它的顶部。

转到/usr/local/lib/python2.7/dist-package/并删除名称中带有“ PIL”的内容(包括目录)。如果枕头。Egg 文件在那里,你也可以删除它。 然后重新安装枕头。

将“ python2.7”替换为您正在使用的 python 版本。

如果在一个操作系统中构建 Pillow,然后将 site-packages的内容复制到另一个操作系统中,也会发生这种情况。例如,如果您正在创建 AWS Lambda 部署包,那么在运行 Lambda 函数时就会遇到这个错误。如果是这种情况,那么 Pillow 需要安装在 Amazon Linux 实例中,并且必须在部署包中使用生成的 site-packages。点击这里查看说明和细节:

Http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html

你喜欢什么样的枕头?

enter image description here

枕头 > = 2.1.0不再支持 import _imaging。请改用 from PIL.Image import core as _imaging

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

pip install -U Pillow

我使用的是带有 Google App Engine 的 Flask,我通过以下命令安装了枕头模块:

pip install -t lib pillow

我通过在 app.yaml 文件中定义 PIL 修复了这个错误:

libraries:
- name: PIL
version: latest

当它试图部署一个 lambda 包时,我遇到了同样的问题,问题是你必须预编译模拟你将要使用的 lambda 体系结构/运行时的包,否则你会得到 cannot import name _imaging。解决这个问题的两种方法:

1-旋转一个 EC2 Amazon Linux 实例。(我将只覆盖这一部分)

2-使用码头工人。


简单的解决办法

  1. 在 Amazon Linux 2实例中安装 Python 3(必须是您计划在 lambda 中使用的 python3.X)
  2. 在 ec2-user 主目录下安装一个虚拟环境。
  3. 激活环境,然后安装 Boto 3。
  4. 安装枕头
  5. 使用库的内容(PIL 和 Pillow.libs)创建一个 ZIP 归档文件
  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 标识和访问管理(IAM)角色附加到 EC2实例,以便 Boto 3可以与 AWS API 交互。对于其他身份验证方法... . 为了快速使用,您可以使用 $ aws confifure 请参阅文件(您将在步骤7中需要这个)

3.1激活环境,方法是在项目目录下的 bin 目录中找到激活文件。

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

确保在您的环境中安装了最新的 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-package。

重点 : 这里的关键是将 site-package 中的文件压缩到 我只用 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. 更新你的 lambda。(AWS CLI) 如果您还没有创建一个 lambda 函数,那么在从 awscli 更新该函数之前现在就创建,确保您拥有从 awscli 更新 lambda 的权限。

    更改函数名的 LAMBDAFUNCIONNAME

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

摆脱地狱的第一个循环

转到 lambda 控制台并测试代码,确保使用与 EC2实例中相同的运行时/Python 版本

这可能是一个小众的解决方案,但我能够解决这个问题的魅力去 file->settings->python interpreter和点击升级标志旁边的枕头包。

我在 Python 3.6中也犯了同样的错误。升级枕头帮我完成了这项工作。

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

对于其他 Python 版本,可能使用您的版本而不是3.6。

快速解决方案-同时导入 PyQt5, 您将不会收到该错误消息。

导入 PyQt5

来自 PIL 导入的图像抓取

正如其他一些答案所暗示的那样,当您在 MacOS 上构建 Pillow 并尝试在另一个操作系统中导入 PIL 时,可能会发生这种情况,就像某些 Amazon Linux 风格一样。

我的确切用例是将 image hash 打包为 Lambda 层,其中包括枕头作为依赖项。下面的准则对我来说非常适用于所有的 Python 包。

  1. 安装 SAM CLI SAM 安装
  2. 使用定义的 lambda 处理程序创建 python 脚本
  3. 使用定义的 Lambda 函数创建 template.yml 文件。
  4. 将您试图为其创建一个层的包添加到 Requments.txt。
  5. 运行以下 SAM 命令 sam build -t path_to_template
  6. 您现在将拥有以下目录 .aws-sam/build/{Logical ID Of Lambda Function}。在内部,您将看到您的 python 包及其依赖项已经安装,就像您运行 pip download package并解压轮文件一样。

现在,SAM 已经专门为 Lambda 准备了 python 文件,您可以继续按照需要创建 Lambda 层。配置 Lambda 层

因为我已经使用 AWS SAM CLI 在本地运行 Lambda 函数,所以这是创建我的层最简单的方法。

如果您试图在 Linux 环境中运行安装在 Mac 上的 Pillow (例如,在 Mac 上构建 AWS Lambda,然后将其部署到 Linux 运行时) ,就会发生这种情况。

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

pip3 install --platform manylinux1_x86_64 --only-binary=:all:

在指定 --platform时需要 --only-binary=:all:,平台本身可以通过查看 https://pypi.org/project/Pillow/7.2.0/#files找到(例如)-平台是文件名的最后一部分,例如 win32,manylinux1 _ x86 _ 64,manylinux1 _ i686等。

这样就避免了运行 Linux 来安装 Pillow 的 Linux 版本。

解决方案

  1. 卸载 PIL
  2. 皮普卸载枕头
  3. 安装枕头