python/django - "无法使用ImageField,因为未安装Pillow

28 投票
25 回答
63569 浏览
提问于 2025-04-19 18:51

我正在加入一个项目,所以我想设置环境。我做的事情是:

pip install -r requirements.txt

这一步完全安装了所有需要的东西,包括django 1.7.0、Pillow 2.4.0和其他一些库。

然后我想建立数据库:

python manage.py migrate

结果出现了错误,我得到了以下信息:

CommandError: System check identified some issues:

ERRORS:
stu.chan.icon: (fields.E210) Cannot use ImageField because Pillow is not installed.
    HINT: Get Pillow at https://pypi.python.org/pypi/Pillow or run command "pip install pillow".
stu.chan.image: (fields.E210) Cannot use ImageField because Pillow is not installed.
    HINT: Get Pillow at https://pypi.python.org/pypi/Pillow or run command "pip install pillow".
stu.Piec.icon: (fields.E210) Cannot use ImageField because Pillow is not installed.
    HINT: Get Pillow at https://pypi.python.org/pypi/Pillow or run command "pip install pillow".

... 就好像我没有安装Pillow一样。于是我检查了已安装的包(用这个方法),发现确实已经安装了。

接着,我还尝试强制重新安装:pip install --upgrade --force-reinstall Pillow==2.4.0

但是,没用,运行migrate时还是出现同样的错误。

我在mac OS X 10.6.7上使用python 3.4.0django 1.7.0,并且在virtualenv 1.11.6中,pip降级到了pip 1.2.1(因为有一些众所周知但尚未完全解决或理解的问题,与pip和ssl有关)。

以上所有代码都在virtualenv中运行(bin/activate已经完成)。

你有什么想法,为什么会出现这个问题以及如何解决它吗?

- - - - - - 编辑 - - - - - -

当我运行上面的强制重新安装命令时,(输出了很多代码,我不能全部粘贴,但)虽然最后显示“成功安装Pillow”,但代码中有一些警告:

building 'PIL._imaging' extension
 (blabla code)
    _imaging.c:975:13: warning: array index of '1' indexes past the end of an array (that contains 1 elements) [-Warray-bounds]
        value = PyTuple_GET_ITEM(xy, 1);
                ^~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/python3.4m/tupleobject.h:58:34: note: instantiated from:
    #define PyTuple_GET_ITEM(op, i) (((PyTupleObject *)(op))->ob_item[i])
                                     ^
    /usr/local/include/python3.4m/tupleobject.h:27:5: note: array 'ob_item' declared here
        PyObject *ob_item[1];
        ^
    1 warning generated.

(blabla code)
   libImaging/Unpack.c:867:1: warning: unused function 'copy3' [-Wunused-function]
    copy3(UINT8* out, const UINT8* in, int pixels)
    ^
    1 warning generated.

25 个回答

2

我遇到过类似的问题,我的解决办法简单多了:

看起来PIL和Pillow这两个包不能同时存在。如果你想用Pillow,首先得卸载PIL,然后再安装Pillow。

如果你在Mac上,还需要通过brew安装一些库。下面是步骤的顺序:

$pip uninstall PIL
$brew install libtiff libjpeg webp little-cms2
$pip install Pillow

要测试Pillow是否安装好并可以使用,打开Python解释器,试着导入以下内容:

>>> from PIL import Image

*注意,虽然库的名字还是PIL,但现在是从Pillow导入,而不是从PIL导入。

如果你能成功导入,那就没问题了(一般来说,你不需要担心设置PYTHONPATH或者32/64位的安装问题)。

来源: https://pillow.readthedocs.io/en/latest/installation.html

4

对于那些在使用基于Alpine的Docker镜像时遇到这个问题的人;

Pillow这个库在安装时需要一些操作系统级别的模块

gcc
musl-dev
jpeg-dev
zlib-dev
libjpeg

你可能在安装完Python包后删除了这些模块,但如果想要顺利使用Pillow,就必须保留libjpeg这个模块。否则,Django会报错:

无法使用ImageField,因为Pillow没有安装。

所以在Dockerfile中添加这个模块(或者不要卸载它):

RUN apk add libjpeg

对我来说是有效的

5

我在用Cloudinary实现图片上传的时候也遇到了同样的问题,不过我找到了上面的答案,但我用了一种不同的方法。

 sudo pip uninstall PIL

 sudo pip uninstall Pillow

 sudo pip install Pillow

之后我的问题就解决了!

38

我在一台使用Python 3.6.4的Mac上遇到了这个问题。解决办法是卸载Pillow 5.1.0,然后安装5.0.0版本。

pip uninstall Pillow
pip install Pillow==5.0.0
7

我尝试了:

  • 按照这里的一些说明,重新编译全局的PIL(图像库)“Imaging-1.1.7”,但没成功。
  • 通过这个链接重新安装Pillow及其依赖项,但也没成功。
  • 使用这个链接重新安装GCC4.2,但还是没成功。

最后我发现,我的情况正好符合这篇帖子中提到的情况。换句话说,我的Mac电脑的CPU支持64位,但内核固件设置为32位。这就成了问题,因为我正在做的项目是为64位系统构建的。

正如那篇帖子中解释的,当你使用安装程序(DMG)安装python3时,它会检测内核是否设置为32位,并相应地安装32位版本的python3。但如果你直接从Python官网上下载源代码包并用以下命令安装:

cd Python-3.4.1
./configure
make
sudo make install

那么就会安装64位版本的python3。你可以通过以下命令来验证:

file /usr/local/bin/python3
/usr/local/bin/python3: Mach-O 64-bit executable x86_64

完成这些后,使用这个64位版本的python3,PIL/Pillow在虚拟环境中的所有问题都解决了。甚至连pip降级也变得不必要了。

撰写回答