Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot import ImageCms with no LITTLECMS2 feature installed #8193

Closed
mrbean-bremen opened this issue Jul 2, 2024 · 8 comments · Fixed by #8197
Closed

Cannot import ImageCms with no LITTLECMS2 feature installed #8193

mrbean-bremen opened this issue Jul 2, 2024 · 8 comments · Fixed by #8197

Comments

@mrbean-bremen
Copy link

If building pillow without the LITTLECMS2 feature (e.g. with the lcms library not present), it was still possible to import ImageCms until pillow 10.2. This is done by using DeferredError:

try:
    from . import _imagingcms as core
except ImportError as ex:
    # Allow error import for doc purposes, but error out when accessing
    # anything in core.
    from ._util import DeferredError

    core = DeferredError.new(ex)

With the type hints added in 10.3, there is now a top level access to _imagingcms alias core:

 _CmsProfileCompatible = Union[
    str, SupportsRead[bytes], core.CmsProfile, ImageCmsProfile
]

Using

from PIL import ImageCms

causes now (in 10.3/10.4):

Traceback (most recent call last):
ImageCms.py(370) , in <module>
ImageCms.py(370)    str, SupportsRead[bytes], core.CmsProfile, ImageCmsProfile
ImageCms.py(370)                              ^^^^^^^^^^^^^^^
_util.py(23) , in __getattr__
_util.py(23)    raise self.ex
ImageCms.py(33) , in <module>
ImageCms.py(33)    from . import _imagingcms as core
ImportError: cannot import name '_imagingcms' from 'PIL' (C:\git\...\site-packages\PIL\__init__.py)

Happens both under Windows (as shown) and Linux.

This is probably a fringe problem, but can easily be fixed by using the string version of the problematic type hint:

 _CmsProfileCompatible = Union[
    str, SupportsRead[bytes], "core.CmsProfile", ImageCmsProfile
]

Environment:

  • OS: Windows 10, Ubuntu 22.04
  • Python: 3.11
  • Pillow: 103, 10.4

Features:

--------------------------------------------------------------------
Pillow 10.3.0
Python 3.11.9 (main, Jun 28 2024, 12:22:23) [MSC v.1939 64 bit (AMD64)]
--------------------------------------------------------------------
Python executable is C:\git\...bin\Python.exe
Environment Python files loaded from C:\git\...\bin
System Python files loaded from 
--------------------------------------------------------------------
Python Pillow modules loaded from C:\git\...\Lib\site-packages\PIL
Binary Pillow modules loaded from C:\git\...\Lib\site-packages\PIL
--------------------------------------------------------------------
--- PIL CORE support ok, compiled for 10.3.0
*** TKINTER support not installed
*** FREETYPE2 support not installed
*** LITTLECMS2 support not installed
*** WEBP support not installed
*** WEBP Transparency support not installed
*** WEBPMUX support not installed
*** WEBP Animation support not installed
--- JPEG support ok, compiled for libjpeg-turbo 3.0.3
*** OPENJPEG (JPEG2000) support not installed
--- ZLIB (PNG/ZIP) support ok, loaded 1.3.1
--- LIBTIFF support ok, loaded 4.6.0
*** RAQM (Bidirectional Text) support not installed
*** LIBIMAGEQUANT (Quantization method) support not installed
*** XCB (X protocol) support not installed
--------------------------------------------------------------------
@nulano
Copy link
Contributor

nulano commented Jul 2, 2024

Yes, you are right this was unintentional. I've created #8196 to fix it.

@cleebp
Copy link

cleebp commented Aug 8, 2024

Ran into this today it still appears to be an issue when building from main on windows without lcms2 present.

edit: made a patch for my build to pass without adding the lcms2 depenency, here's the gist

@aclark4life
Copy link
Member

Looks like we're waiting on resolution to a Docs build issue in order to merge the fix(s).

@radarhere
Copy link
Member

edit: made a patch for my build to pass without adding the lcms2 depenency, here's the gist

This is the same as proposed fix #8196

@mrbean-bremen
Copy link
Author

Both #8196 and #8197 fix the problem, it's just a matter of somebody (I guess @radarhere or @hugovk) to decide which one to use.

@radarhere
Copy link
Member

Looks like we're waiting on resolution to a Docs build issue in order to merge the fix(s).

I'm not entirely sure about the priority level of building docs without dependencies (Pillow is a library first and foremost, has public online documentation, and has distributed documentation as a bonus feature), but I've found that just using nitpick_ignore can workaround the matter - e938283

@mrbean-bremen
Copy link
Author

@radarhere - thanks for the fix! From my perspective (which admittedly may not be that relevant here) your fix is the cleaner approach, and I see no reason not to merge it.

@radarhere
Copy link
Member

The opinion of Pillow users should always be relevant. Thanks for your review - just waiting for approval from another member of the core team.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
5 participants