[PyQt] QML plugins - AttributeError: module 'PyQt5' has no attribute 'sip'
Kyle Altendorf
sda at fstab.net
Sun Mar 8 04:46:45 GMT 2020
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
More information about the PyQt
mailing list