尽管安装了 Django,但找不到 Pillow

zar*_*ski 1 python django python-imaging-library docker alpine-linux

Django 努力寻找Pillow,我不太确定为什么。

环境

基于 Linux Alpine 的 Docker 镜像,Django 2.2。以下是相关部分:

Dockerfile

RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev jpeg-dev zlib-dev \
    && apk add --no-cache mariadb-dev mariadb-client

# install dependencies
RUN pip install --upgrade pip
RUN pip install pipenv
RUN pip install mysqlclient
COPY ./Pipfile /usr/src/cms/Pipfile
RUN pipenv install --skip-lock --system --dev
RUN apk del build-deps
Run Code Online (Sandbox Code Playgroud)

文件

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
django = "==2.2"
markdown = "==3.1.1"
pillow = "==5.0.0"

[requires]
python_version = "3.6"
Run Code Online (Sandbox Code Playgroud)

问题

当我python manage.py runserver 0.0.0.0:8000从容器运行时,出现以下错误:

django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
website.Photo.photo: (fields.E210) Cannot use ImageField because Pillow is not installed.
    HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "pip install Pillow".
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为pip install Pillow给了我

Requirement already satisfied: Pillow in /usr/local/lib/python3.7/site-packages (5.4.1)
Run Code Online (Sandbox Code Playgroud)

关于 Pillow 与 PIL 的冲突

在看的时候/usr/local/lib/python3.7/site-packages,我注意到我有PILPillow。这是:

  1. 冲突的来源(Pillow 的文档)对于卸载 PIL 的需要非常具体
  2. 枕头使用名称PIL来保持本讨论中建议的兼容性?

从 i) pip uninstall PIL-> not installedii) print(PIL.PILLOW_VERSION)->5.0.0在 python 的 shell 和 iii) Django 使用from PIL import Image source的事实来看,我会去假设 2。那么如果 Pillow 安装在容器中,为什么 Django 找不到它?

当前路径

>>> from PIL import Image
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/PIL/Image.py", line 58, in <module>
    from . import _imaging as core
ImportError: Error loading shared library libjpeg.so.8: No such file or directory (needed by /usr/local/lib/python3.7/site-packages/PIL/_imaging.cpython-37m-x86_64-linux-gnu.so)
Run Code Online (Sandbox Code Playgroud)

我添加jpeg-dev到 Dockerfile 中,但不知何故,它似​​乎还不够。还在挖。感谢您提供任何线索

zar*_*ski 6

事实证明,jpeg-dev(编译需要)不足以满足执行期间的所有依赖项。添加libjpeg解决了问题。更新的Dockerfile

# install mysqlclient
RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev jpeg-dev zlib-dev \
    && apk add --no-cache mariadb-dev mariadb-client

# install dependencies
RUN pip install --upgrade pip
RUN pip install pipenv
RUN pip install mysqlclient
RUN apk add libjpeg      -------------> et voila
COPY ./Pipfile /usr/src/cms/Pipfile
RUN pipenv install --skip-lock --system --dev
RUN apk del build-deps
Run Code Online (Sandbox Code Playgroud)