[PyQt] Next Releases

Georg Brandl g.brandl at gmx.net
Mon Sep 8 19:16:41 BST 2014


On 09/08/2014 07:29 PM, Georg Brandl wrote:

>>>          // Make sure the interpreter is loaded and initialised.  Leave 
>>> this as
>>>          // late as possible.
>>> -        if (!Py_IsInitialized())
>>> -        {
>>> -            QLibrary library(PYTHON_LIB);
>>> -
>>> -            library.setLoadHints(QLibrary::ExportExternalSymbolsHint);
>>> -
>>> -            if (!library.load())
>>> -                return;
>>> -
>>> -            Py_Initialize();
>>> -        }
>>> +        Py_Initialize();
>>> 
>>>          // Make sure we have sys.path.
>>>          if (!sys_path)
>> 
>> The reason why that code was removed was because I couldn't see how it 
>> was having any affect - if Py_Initialized() could be called then the 
>> library must already be loaded. However if it fixes your problem then 
>> I'll revert it. The value of PYTHON_LIB should be 
>> "/path/to/libpython2.7".
> 
> I've just made a new build with the change reverted (with a hardcoded path
> in place of PYTHON_LIB) and can confirm that it fixes the issue.
> 
> I won't pretend to understand it either...

Hmm, as far as I can understand the thing after looking into "man dlopen" a
bit: the designer loads its plugins with QPluginLoader, which by default
doesn't use the RTLD_GLOBAL flag (i.e. ExportExternalSymbolsHint in Qt
parlance).  The libpyqt4.so designer plugin is loaded, and since it is
dynamically linked with libpython2.7, that one gets loaded too, but is not
available for global symbol resolution.

Now the sip.so extension is *not* linked with libpython2.7 (like all Python
extension modules), so when it gets loaded with dlopen (by Python), the linker
can't find the symbols exported by the Python library.  The old code basically
enforced Python symbols to be global and available for resolution by the linker.

Hope that makes at least a bit of sense...

cheers,
Georg

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20140908/728a7f9f/attachment.sig>


More information about the PyQt mailing list