cairocffi
cairocffi copied to clipboard
[Windows] ffi.dlopen fails if lib path contains space
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:
- Installed Python 3.8.3 from Windows Store (Not from Python website).
- Installed GTK3 (64-bit) binaries from repo mentioned in
weasyprint
docs. - Installed
weasyprint
. - Ran
python -c 'import weasyprint'
. - 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?
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.
@Nazieh, thanks for your reply. Yes, this works. I can confirm. I'm hoping the bug itself can be resolved for others as well.