Kozea / cairocffi

CFFI-based cairo bindings for Python.
https://doc.courtbouillon.org/cairocffi
BSD 3-Clause "New" or "Revised" License
207 stars 53 forks source link

[Windows] ffi.dlopen fails if lib path contains space #158

Open mahmoudajawad opened 4 years ago

mahmoudajawad commented 4 years ago

Occasionally, when I'm refreshing Python installation on Windows 10, I end up with issues attempting to get weasyprint to work, and it's only that some random step that resolves the issue and I just overlook what happened and continue my day. Today however, I wanted to document what has happened to me in order to make sure I know exactly what has happened and how to resolve the issue in the future. I've done this:

  1. Installed Python 3.8.3 from Windows Store (Not from Python website).
  2. Installed GTK3 (64-bit) binaries from repo mentioned in weasyprint docs.
  3. Installed weasyprint.
  4. Ran python -c 'import weasyprint'.
  5. Got:
cannot load library 'C:\Program Files\GTK3-Runtime Win64\bin\libcairo-2.dll': error 0x7e
cannot load library 'libcairo.so': error 0x7e
cannot load library 'libcairo.2.dylib': error 0x7e
cannot load library 'libcairo-2.dll': error 0x7e

To understand what's going on, I added a breakpoint at line 45 for file __init__.py which is one step before raising OSError.

Printing exceptions from the breakpoint gave the following message:

['no library called "cairo" was found', OSError("cannot load library 'C:\\Program Files\\GTK3-Runtime Win64\\bin\\libcairo-2.dll': error 0x7e"), OSError("cannot load library 'libcairo.so': error 0x7e"), OSError("cannot load library 'libcairo.2.dylib': error 0x7e"), OSError("cannot load library 'libcairo-2.dll': error 0x7e")]

I could be wrong, but isn't this asserting ffi.dlopen is failing because it's not correctly escaping the spaces in the path to load the lib?

Nazieh commented 4 years ago

Hala mahmoudajawad,

You are right the problem is with spaces in the directory name.

Just download the gtk+ bundle from here, unzip the file into a directory with no spaces, ( C:\gtk ) for example, finally just add the bin directory of the folder you unzipped into your path variable.

Not super elegant, but works.

mahmoudajawad commented 4 years ago

@Nazieh, thanks for your reply. Yes, this works. I can confirm. I'm hoping the bug itself can be resolved for others as well.