QML plugins - AttributeError: module 'PyQt5' has no attribute 'sip'

Kyle Altendorf <[email protected]>
Newsgroups gmane.comp.python.pyqt-pykde
Message-ID <[email protected]>
I'm working on catching up pyqt5-tools [0] with the new build system for 
PyQt5.  I have it building and working in some cases.  The present issue 
I am trying to address is the failure of my simple tests of the QML 
plugins when running in GitHub Actions.  If I download the wheel the 
build generates and tests against (as far as I know...) it works fine 
locally.  On the server I get an error [1].

     AttributeError: module 'PyQt5' has no attribute 'sip'

I tried patching qmlscene/pluginloader.cpp [2].

     diff --git a/qmlscene/pluginloader.cpp b/qmlscene/pluginloader.cpp
     index 635d31e..5c33b1f 100644
     --- a/qmlscene/pluginloader.cpp
     +++ b/qmlscene/pluginloader.cpp
     @@ -412,9 +412,9 @@ PyObject *PyQt5QmlPlugin::getModuleAttr(const 
char *module, const char *attr)
     void PyQt5QmlPlugin::getSipAPI()
     {
     #if defined(SIP_USE_PYCAPSULE)
     -    sip = (const sipAPIDef *)PyCapsule_Import("PyQt5.sip._C_API", 
0);
     +    sip = (const sipAPIDef *)PyCapsule_Import("PyQt5.a_sip._C_API", 
0);
     #else
     -    PyObject *c_api = getModuleAttr("PyQt5.sip", "_C_API");
     +    PyObject *c_api = getModuleAttr("PyQt5.b_sip", "_C_API");

         if (c_api)
         {

The patched `a_sip` was triggered in CI [3] but not locally.  Maybe that 
means that somehow Python is getting initialized previously when run 
locally somehow?  (based on the PyQt5QmlPlugin constructor)  Or I really 
am not running the same thing locally?  I tried a few things without any 
apparent knowledge gain.  I'll hope someone here has some insight and 
stop for now with my most recent attempt [4].

     diff --git a/qmlscene/pluginloader.cpp b/qmlscene/pluginloader.cpp
     index 635d31e..d6acd6e 100644
     --- a/qmlscene/pluginloader.cpp
     +++ b/qmlscene/pluginloader.cpp
     @@ -412,6 +412,16 @@ PyObject *PyQt5QmlPlugin::getModuleAttr(const 
char *module, const char *attr)
     void PyQt5QmlPlugin::getSipAPI()
     {
     #if defined(SIP_USE_PYCAPSULE)
     +    PyObject *mod = PyImport_ImportModule("PyQt5.sip");
     +    if (!mod)
     +    {
     +        PyErr_Print();
     +        return;
     +    }
     +    else
     +    {
     +        Py_DECREF(mod);
     +    }
         sip = (const sipAPIDef *)PyCapsule_Import("PyQt5.sip._C_API", 
0);
     #else
         PyObject *c_api = getModuleAttr("PyQt5.sip", "_C_API");

This eliminates the error but still fails my tests in CI [5].  The tests 
[6] basically just check for some reference data to be written to files 
by my custom examples when the PyQt5 plugins handle them.

Thanks for any help that you can offer.

Cheers,
-kyle


[0] https://github.com/altendky/pyqt5-tools/pull/41

[1] 
https://gist.githubusercontent.com/altendky/53479b3a57069453f5511b7e02a2e4fd/raw/7bbf58c3d518ea27443eee518e7efa46802d61c4/gistfile1.txt

[2] 
https://github.com/altendky/pyqt5-tools/pull/41/commits/4c72f778afce88c8e68e25fcfad616c2e8b9eec1#diff-44b7c383d27b03d3ef422f5aa45078c5

[3] 
https://gist.githubusercontent.com/altendky/b3d77b52aaa785ed980c7682aaa07f07/raw/b313c3945202cdaae67387cdfd9b5667e1808322/gistfile1.txt

[4] 
https://github.com/altendky/pyqt5-tools/commit/2494b3decf161f49b86174615960610d1078ff03

[5] 
https://gist.githubusercontent.com/altendky/7082b1301aa3c0cf162024d37e52ae72/raw/6e4faa3b484f9d95727b8bbd5399b90d660ab8b9/gistfile1.txt

[6] 
https://github.com/altendky/pyqt5-tools/blob/2494b3decf161f49b86174615960610d1078ff03/src/pyqt5_tools/tests/test_entrypoints.py
_______________________________________________
PyQt mailing list    [email protected]
https://www.riverbankcomputing.com/mailman/listinfo/pyqt
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.