Python

No such file or directory limitsh when installing Pillow on Alpine Linux

27 September 2026 · 14 min read

No such file or directory limitsh when installing Pillow on Alpine Linux

Encountering the “No such file or directory ’limits.h’” error can be a frustrating roadblock for developers working with Python and image processing on Alpine Linux. This specific issue frequently arises when attempting to install the popular Pillow library, a fundamental component for handling images in Python applications. Alpine Linux, known for its small footprint and security-focused design, achieves its minimalism by using musl libc instead of the more common GNU C Library (glibc). While this offers significant advantages in containerized environments, it also means that system headers and build processes can differ, leading to unexpected compilation errors like the missing limits.h file. Understanding this core distinction is the first step towards a smooth Pillow installation and ensuring your image manipulation tasks proceed without a hitch on this lightweight operating system.

Understanding the ’limits.h’ Error on Alpine Linux

The “No such file or directory ’limits.h’” error is a classic compilation problem indicating that the C compiler (typically GCC) cannot locate a standard header file required by the software it’s trying to build. In the context of installing Python packages like Pillow on Alpine Linux, this usually points to missing development headers or an incomplete build environment. Unlike other Linux distributions that rely on glibc, Alpine’s musl libc provides a different set of system headers and libraries, which can sometimes cause compatibility challenges for software expecting a glibc-style environment.

Pillow, being a C extension for Python, needs to compile C code during its installation process. This compilation requires various development tools and header files, including those that define system limits, traditionally found in limits.h. When Alpine lacks the specific development packages that provide these headers in a way the Pillow build script expects, the compilation fails. This is not a flaw in Alpine or Pillow, but rather a common hurdle when mixing software designed for one libc implementation with an environment using another. Resolving this often involves carefully identifying and installing the correct Alpine development packages that provide the necessary build tools and header files.

Developers often choose Alpine Linux for its efficiency in Docker containers, but this small size comes with the responsibility of managing dependencies meticulously. The default Alpine image is incredibly lean, meaning many common development tools and libraries that are pre-installed on larger distributions must be explicitly added. This proactive approach to dependency management is key to preventing errors like “No such file or directory ’limits.h’ when installing Pillow on Alpine Linux” and ensuring a robust build pipeline.

Essential Build Dependencies for Pillow on Alpine

To successfully install Pillow on Alpine Linux, it’s crucial to provide a complete build environment that includes not only the Python development headers but also the underlying image processing libraries that Pillow wraps. The error “No such file or directory ’limits.h’” specifically indicates a missing C standard library header, which is often resolved by installing general C development tools. However, Pillow also depends on several external libraries for various image formats and processing capabilities, such as JPEG, PNG, and FreeType for fonts. Without these, even if the limits.h error is fixed, other compilation issues or reduced functionality will occur.

The core development package on Alpine that provides the essential C compiler and standard library headers is build-base. This package acts as a meta-package, pulling in GCC, make, and other fundamental tools. For Python-specific development, python3-dev is indispensable, as it provides the necessary Python header files that Pillow’s C extensions need to compile against the Python interpreter. Beyond these, Pillow requires specific libraries for image handling. For example, zlib-dev for PNG compression, jpeg-dev for JPEG support, and freetype-dev for font rendering are common requirements. Neglecting any of these can lead to a failed installation or a Pillow build that lacks critical features.

Ensuring all these dependencies are present before attempting pip install Pillow is the most robust approach. It’s a common oversight, especially for those new to Alpine’s minimalist philosophy, to assume that Python’s pip will magically handle all system-level dependencies. However, pip is primarily a Python package manager and relies on the underlying operating system to provide the necessary compilation tools and libraries. A quick and effective way to confirm these are installed is to use Alpine’s package manager, apk, as outlined in the solution steps below.

Step-by-Step Solution to Install Pillow on Alpine

When faced with the “No such file or directory ’limits.h’ when installing Pillow on Alpine Linux,” the solution involves a systematic approach to ensure all necessary build dependencies are in place before attempting to install Pillow itself. This method is generally applicable for most Python packages with C extensions on Alpine. The key is to leverage Alpine’s efficient package manager, apk, to prepare your environment. This sequence guarantees that Pillow’s C components have everything they need to compile successfully, avoiding frustrating header file errors.

Here’s a detailed sequence of commands to get Pillow installed correctly:

  1. Update Alpine Package Index: Always start by updating your package lists to ensure you’re installing the latest versions of dependencies. ``` apk update
  2. Install Core Build Dependencies: This is where you address the limits.h error directly. build-base provides the GCC compiler and essential C headers. ``` apk add build-base
  3. Install Python Development Headers: Pillow is a Python library, so it needs Python’s development headers to compile its C extensions. ``` apk add python3-dev
  4. Install Pillow-Specific Image Libraries: These are crucial for Pillow’s functionality across various image formats. ``` apk add zlib-dev jpeg-dev freetype-dev tiff-dev
    
    
    - `zlib-dev`: For PNG compression/decompression.
    - `jpeg-dev`: For JPEG image support.
    - `freetype-dev`: For font rendering capabilities.
    - `tiff-dev`: For TIFF image support.
    
  5. Install Pillow using pip: Once all system dependencies are installed, you can proceed with the Pillow installation via pip. ``` pip install Pillow

By following these steps, you create a robust build environment that satisfies all of Pillow’s compilation requirements. This systematic approach not only resolves the immediate limits.h error but also prevents subsequent issues related to missing image format support. It’s a best practice to run these apk add commands in your Dockerfile (if using containers) before the pip install step to ensure a reproducible and functional environment.

Best Practices and Troubleshooting Tips for Alpine Python Environments

Successfully installing Pillow is often just one part of setting up a robust Python environment on Alpine Linux. Adhering to best practices can prevent future headaches, while understanding common troubleshooting steps can quickly resolve unexpected issues. The minimalist nature of Alpine requires a more deliberate approach to environment management, especially when dealing with compiled dependencies. It’s not uncommon for developers migrating from larger distributions to overlook Alpine’s unique characteristics, leading to recurrent Question & Answer :

I’m running alpine-linux on a Raspberry Pi 2. I’m trying to install Pillow via this command:

pip install pillow 

This is the output from the command:

Installing collected packages: pillow Running setup.py install for pillow Complete output from command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-gNq0WA/pillow/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-nDKwei-record/install-record.txt --single-version-externally-managed --compile: running install running build running build_py creating build creating build/lib.linux-armv7l-2.7 creating build/lib.linux-armv7l-2.7/PIL copying PIL/XVThumbImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/XpmImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/XbmImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/WmfImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/WebPImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/WalImageFile.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/TiffTags.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/TiffImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/TgaImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/TarIO.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/SunImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/SpiderImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/SgiImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PyAccess.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PSDraw.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PsdImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PpmImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PngImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PixarImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PdfImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PcxImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PcfFontFile.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PcdImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PalmImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/PaletteFile.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/OleFileIO.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/MspImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/MpoImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/MpegImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/MicImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/McIdasImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/JpegPresets.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/JpegImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/Jpeg2KImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/IptcImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImtImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageWin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageTransform.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageTk.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageStat.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageShow.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageSequence.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageQt.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImagePath.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImagePalette.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageOps.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageMorph.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageMode.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageMath.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageGrab.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageFont.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageFilter.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageFileIO.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageFile.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageEnhance.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageDraw2.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageDraw.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageColor.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageCms.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ImageChops.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/Image.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/IcoImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/IcnsImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/Hdf5StubImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/GribStubImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/GimpPaletteFile.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/GimpGradientFile.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/GifImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/GdImageFile.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/GbrImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/FpxImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/FontFile.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/FliImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/FitsStubImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ExifTags.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/EpsImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/DcxImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/CurImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/ContainerIO.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/BufrStubImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/BmpImagePlugin.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/BdfFontFile.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/_util.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/_binary.py -> build/lib.linux-armv7l-2.7/PIL copying PIL/__init__.py -> build/lib.linux-armv7l-2.7/PIL running egg_info writing Pillow.egg-info/PKG-INFO writing top-level names to Pillow.egg-info/top_level.txt writing dependency_links to Pillow.egg-info/dependency_links.txt warning: manifest_maker: standard file '-c' not found reading manifest file 'Pillow.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching 'LICENSE' under directory 'docs' writing manifest file 'Pillow.egg-info/SOURCES.txt' copying PIL/OleFileIO-README.md -> build/lib.linux-armv7l-2.7/PIL running build_ext building 'PIL._imaging' extension creating build/temp.linux-armv7l-2.7/libImaging gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c _imaging.c -o build/temp.linux-armv7l-2.7/_imaging.o gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c outline.c -o build/temp.linux-armv7l-2.7/outline.o gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/Bands.c -o build/temp.linux-armv7l-2.7/libImaging/Bands.o gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/ConvertYCbCr.c -o build/temp.linux-armv7l-2.7/libImaging/ConvertYCbCr.o In file included from _imaging.c:76:0: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. In file included from outline.c:20:0: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/ConvertYCbCr.c:15: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/Bands.c:19: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/Draw.c -o build/temp.linux-armv7l-2.7/libImaging/Draw.o gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/Filter.c -o build/temp.linux-armv7l-2.7/libImaging/Filter.o gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/GifEncode.c -o build/temp.linux-armv7l-2.7/libImaging/GifEncode.o gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/LzwDecode.c -o build/temp.linux-armv7l-2.7/libImaging/LzwDecode.o In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/Draw.c:35: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/Filter.c:27: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/GifEncode.c:20: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/LzwDecode.c:31: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/Offset.c -o build/temp.linux-armv7l-2.7/libImaging/Offset.o gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/Quant.c -o build/temp.linux-armv7l-2.7/libImaging/Quant.o gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/PcxDecode.c -o build/temp.linux-armv7l-2.7/libImaging/PcxDecode.o gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/RawEncode.c -o build/temp.linux-armv7l-2.7/libImaging/RawEncode.o In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/Offset.c:18: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/Quant.c:21: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/PcxDecode.c:17: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/RawEncode.c:21: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/UnpackYCC.c -o build/temp.linux-armv7l-2.7/libImaging/UnpackYCC.o gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/ZipEncode.c -o build/temp.linux-armv7l-2.7/libImaging/ZipEncode.o gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -DHAVE_LIBJPEG -I/tmp/pip-build-gNq0WA/pillow/libImaging -I/usr/include -I/usr/include/python2.7 -c libImaging/BoxBlur.c -o build/temp.linux-armv7l-2.7/libImaging/BoxBlur.o In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/UnpackYCC.c:17: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. In file included from libImaging/ImPlatform.h:10:0, from libImaging/Imaging.h:14, from libImaging/ZipEncode.c:18: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. In file included from libImaging/BoxBlur.c:1:0: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. Building using 4 processes gcc -shared -Wl,--as-needed build/temp.linux-armv7l-2.7/_imaging.o build/temp.linux-armv7l-2.7/decode.o build/temp.linux-armv7l-2.7/encode.o build/temp.linux-armv7l-2.7/map.o build/temp.linux-armv7l-2.7/display.o build/temp.linux-armv7l-2.7/outline.o build/temp.linux-armv7l-2.7/path.o build/temp.linux-armv7l-2.7/libImaging/Access.o build/temp.linux-armv7l-2.7/libImaging/AlphaComposite.o build/temp.linux-armv7l-2.7/libImaging/Resample.o build/temp.linux-armv7l-2.7/libImaging/Bands.o build/temp.linux-armv7l-2.7/libImaging/BitDecode.o build/temp.linux-armv7l-2.7/libImaging/Blend.o build/temp.linux-armv7l-2.7/libImaging/Chops.o build/temp.linux-armv7l-2.7/libImaging/Convert.o build/temp.linux-armv7l-2.7/libImaging/ConvertYCbCr.o build/temp.linux-armv7l-2.7/libImaging/Copy.o build/temp.linux-armv7l-2.7/libImaging/Crc32.o build/temp.linux-armv7l-2.7/libImaging/Crop.o build/temp.linux-armv7l-2.7/libImaging/Dib.o build/temp.linux-armv7l-2.7/libImaging/Draw.o build/temp.linux-armv7l-2.7/libImaging/Effects.o build/temp.linux-armv7l-2.7/libImaging/EpsEncode.o build/temp.linux-armv7l-2.7/libImaging/File.o build/temp.linux-armv7l-2.7/libImaging/Fill.o build/temp.linux-armv7l-2.7/libImaging/Filter.o build/temp.linux-armv7l-2.7/libImaging/FliDecode.o build/temp.linux-armv7l-2.7/libImaging/Geometry.o build/temp.linux-armv7l-2.7/libImaging/GetBBox.o build/temp.linux-armv7l-2.7/libImaging/GifDecode.o build/temp.linux-armv7l-2.7/libImaging/GifEncode.o build/temp.linux-armv7l-2.7/libImaging/HexDecode.o build/temp.linux-armv7l-2.7/libImaging/Histo.o build/temp.linux-armv7l-2.7/libImaging/JpegDecode.o build/temp.linux-armv7l-2.7/libImaging/JpegEncode.o build/temp.linux-armv7l-2.7/libImaging/LzwDecode.o build/temp.linux-armv7l-2.7/libImaging/Matrix.o build/temp.linux-armv7l-2.7/libImaging/ModeFilter.o build/temp.linux-armv7l-2.7/libImaging/MspDecode.o build/temp.linux-armv7l-2.7/libImaging/Negative.o build/temp.linux-armv7l-2.7/libImaging/Offset.o build/temp.linux-armv7l-2.7/libImaging/Pack.o build/temp.linux-armv7l-2.7/libImaging/PackDecode.o build/temp.linux-armv7l-2.7/libImaging/Palette.o build/temp.linux-armv7l-2.7/libImaging/Paste.o build/temp.linux-armv7l-2.7/libImaging/Quant.o build/temp.linux-armv7l-2.7/libImaging/QuantOctree.o build/temp.linux-armv7l-2.7/libImaging/QuantHash.o build/temp.linux-armv7l-2.7/libImaging/QuantHeap.o build/temp.linux-armv7l-2.7/libImaging/PcdDecode.o build/temp.linux-armv7l-2.7/libImaging/PcxDecode.o build/temp.linux-armv7l-2.7/libImaging/PcxEncode.o build/temp.linux-armv7l-2.7/libImaging/Point.o build/temp.linux-armv7l-2.7/libImaging/RankFilter.o build/temp.linux-armv7l-2.7/libImaging/RawDecode.o build/temp.linux-armv7l-2.7/libImaging/RawEncode.o build/temp.linux-armv7l-2.7/libImaging/Storage.o build/temp.linux-armv7l-2.7/libImaging/SunRleDecode.o build/temp.linux-armv7l-2.7/libImaging/TgaRleDecode.o build/temp.linux-armv7l-2.7/libImaging/Unpack.o build/temp.linux-armv7l-2.7/libImaging/UnpackYCC.o build/temp.linux-armv7l-2.7/libImaging/UnsharpMask.o build/temp.linux-armv7l-2.7/libImaging/XbmDecode.o build/temp.linux-armv7l-2.7/libImaging/XbmEncode.o build/temp.linux-armv7l-2.7/libImaging/ZipDecode.o build/temp.linux-armv7l-2.7/libImaging/ZipEncode.o build/temp.linux-armv7l-2.7/libImaging/TiffDecode.o build/temp.linux-armv7l-2.7/libImaging/Incremental.o build/temp.linux-armv7l-2.7/libImaging/Jpeg2KDecode.o build/temp.linux-armv7l-2.7/libImaging/Jpeg2KEncode.o build/temp.linux-armv7l-2.7/libImaging/BoxBlur.o -L/usr/lib -L/usr/local/lib -L/usr/lib -ljpeg -lpython2.7 -o build/lib.linux-armv7l-2.7/PIL/_imaging.so gcc: error: build/temp.linux-armv7l-2.7/_imaging.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/decode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/encode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/map.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/display.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/outline.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/path.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Access.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/AlphaComposite.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Resample.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Bands.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/BitDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Blend.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Chops.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Convert.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/ConvertYCbCr.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Copy.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Crc32.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Crop.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Dib.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Draw.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Effects.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/EpsEncode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/File.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Fill.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Filter.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/FliDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Geometry.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/GetBBox.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/GifDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/GifEncode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/HexDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Histo.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/JpegDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/JpegEncode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/LzwDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Matrix.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/ModeFilter.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/MspDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Negative.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Offset.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Pack.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/PackDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Palette.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Paste.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Quant.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/QuantOctree.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/QuantHash.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/QuantHeap.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/PcdDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/PcxDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/PcxEncode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Point.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/RankFilter.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/RawDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/RawEncode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Storage.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/SunRleDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/TgaRleDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Unpack.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/UnpackYCC.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/UnsharpMask.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/XbmDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/XbmEncode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/ZipDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/ZipEncode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/TiffDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Incremental.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Jpeg2KDecode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/Jpeg2KEncode.o: No such file or directory gcc: error: build/temp.linux-armv7l-2.7/libImaging/BoxBlur.o: No such file or directory error: command 'gcc' failed with exit status 1 ---------------------------------------- Command "/usr/bin/python -c "import setup tools, tokenize;__file__='/tmp/pip-build-gNq0WA/pillow/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-nDKwei-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-gNq0WA/pillow 

I think this is probably the relevant section:

In file included from libImaging/BoxBlur.c:1:0: /usr/include/python2.7/Python.h:19:20: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. 

My research shows it’s probably something with the header files. I have installed these:

apk add py-configobj libusb py-pip python-dev gcc linux-headers pip install --upgrade pip pip install -U setuptools pip install Cheetah pip install pyusb 

Alpine Linux uses musl libc. You probably need to install musl-dev.