python/django - "无法使用ImageField,因为未安装Pillow
我正在加入一个项目,所以我想设置环境。我做的事情是:
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.0
和django 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 个回答
我遇到过类似的问题,我的解决办法简单多了:
看起来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
对于那些在使用基于Alpine的Docker镜像时遇到这个问题的人;
Pillow这个库在安装时需要一些操作系统级别的模块
gcc
musl-dev
jpeg-dev
zlib-dev
libjpeg
你可能在安装完Python包后删除了这些模块,但如果想要顺利使用Pillow,就必须保留libjpeg这个模块。否则,Django会报错:
无法使用ImageField,因为Pillow没有安装。
所以在Dockerfile中添加这个模块(或者不要卸载它):
RUN apk add libjpeg
对我来说是有效的
我在用Cloudinary实现图片上传的时候也遇到了同样的问题,不过我找到了上面的答案,但我用了一种不同的方法。
sudo pip uninstall PIL
sudo pip uninstall Pillow
sudo pip install Pillow
之后我的问题就解决了!
我在一台使用Python 3.6.4的Mac上遇到了这个问题。解决办法是卸载Pillow 5.1.0,然后安装5.0.0版本。
pip uninstall Pillow
pip install Pillow==5.0.0
我尝试了:
- 按照这里的一些说明,重新编译全局的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降级也变得不必要了。