Version: unspecified (using KDE 4.5.1) OS: Linux In the PyQt4 API version 2, there is no class QString, strings are transparently translated between QString and Python strings. The following code always prints random output because some variable is freed somewhere while still being needed. If PyKDE4 does not yet support API version 2, it should at least check against this when starting but not segfault. Also, http://techbase.kde.org/Development/Languages/Python says nothing about API version compatibilities. I think it should. Reproducible: Always Steps to Reproduce: import sip sip.setapi('QString', 2) from PyKDE4.kdeui import KConfigSkeleton a = KConfigSkeleton() name = 'tilesetName' value = 'I am a value' s = a.addItemString(name, value) print s.value() (gdb) run bug.py Actual Results: value is: 㟀翿!麨翿刐Ï @翿偈 Program received signal SIGSEGV, Segmentation fault. ~QString (node=0xcf6cff) at /usr/include/qt4/QtCore/qstring.h:882 882 inline QString::~QString() { if (!d->ref.deref()) free(d); } (gdb) bt #0 ~QString (node=0xcf6cff) at /usr/include/qt4/QtCore/qstring.h:882 #1 ~QHashNode (node=0xcf6cff) at /usr/include/qt4/QtCore/qhash.h:217 #2 QHash<QString, KConfigSkeletonItem*>::deleteNode2 (node=0xcf6cff) at /usr/include/qt4/QtCore/qhash.h:519 #3 0x00007ffff428cc6d in QHashData::free_helper (this=0xcf5160, node_delete= 0x7ffff47520d0 <QHash<QString, KConfigSkeletonItem*>::deleteNode2(QHashData::Node*)>) at tools/qhash.cpp:271 #4 0x00007ffff474ee70 in QHash<QString, KConfigSkeletonItem*>::freeData (this=0xcad330, __in_chrg=<value optimized out>) at /usr/include/qt4/QtCore/qhash.h:568 #5 ~QHash (this=0xcad330, __in_chrg=<value optimized out>) at /usr/include/qt4/QtCore/qhash.h:284 #6 ~Private (this=0xcad330, __in_chrg=<value optimized out>) at ../../kdecore/config/kcoreconfigskeleton_p.h:40 #7 ~KCoreConfigSkeleton (this=0xcad330, __in_chrg=<value optimized out>) at ../../kdecore/config/kcoreconfigskeleton.cpp:1005 #8 0x00007ffff5e6fecc in sipKConfigSkeleton::~sipKConfigSkeleton() () from /usr/lib/pymodules/python2.6/PyKDE4/kdeui.so #9 0x00007ffff5e02cbc in ?? () from /usr/lib/pymodules/python2.6/PyKDE4/kdeui.so #10 0x00007ffff67a77f9 in ?? () from /usr/lib/pymodules/python2.6/sip.so #11 0x000000000046d2d8 in subtype_dealloc (self=<KConfigSkeleton at remote 0x97cf30>) at ../Objects/typeobject.c:1019 #12 0x000000000044e577 in insertdict (mp=0x8c8270, key='a', hash=12416037344, value=None) at ../Objects/dictobject.c:459 #13 0x0000000000450a77 in PyDict_SetItem (op= {'a': None, 'sip': <module at remote 0x7ffff7f03b40>, 'name': 'tilesetName', '__builtins__': <module at remote 0x7ffff7fa2868>, 'KConfigSkeleton': <PyQt4.QtCore.pyqtWrapperType at remote 0xc77e20>, 'value': 'I am a value', '__package__': None, 's': <ItemString at remote 0xc3c050>, '__name__': '__main__', '__doc__': None}, key='a', value=None) at ../Objects/dictobject.c:701 #14 0x000000000045297e in _PyModule_Clear (m=<value optimized out>) at ../Objects/moduleobject.c:138 #15 0x00000000004bb5fa in PyImport_Cleanup () at ../Python/import.c:441 #16 0x00000000004c922f in Py_Finalize () at ../Python/pythonrun.c:438 #17 0x000000000041a296 in Py_Main (argc=-135380864, argv=<value optimized out>) at ../Modules/main.c:596 #18 0x00007ffff69d9c4d in __libc_start_main (main=<value optimized out>, argc=<value optimized out>, ubp_av=<value optimized out>, init=<value optimized out>, fini=<value optimized out>, rtld_fini=<value optimized out>, stack_end=0x7fffffffddc8) at libc-start.c:226 #19 0x00000000004199f9 in _start () Expected Results: value is: 'I am a value' ii python-qt4 4.7.3-1ubuntu2~lucid1~ppa3 Python bindings for Qt4 ii python-kde4 4:4.5.1-0ubuntu1~lucid1~ppa1 Python bindings for the KDE 4 libraries
this bug still exists with python-kde4 4.8.3
I wasn't aware of this issue (I use API version 1 with a KConfigSkeleton subclass). I followed up on the PyQt mailing list. If a theoretical solution is envisioned (my C++ and SIP knowledge are too limited to do that by myself) I can try implementing it in PyKDE4 (assuming the bug is there and not elsewhere).
this bug still exists with python-kde 4.11.1 both with python 2.7.4 and 3.3.1
This bug still exists with python3-PyKDE4 from KDE 4.14.1. It makes central parts of PyKDE4 unusable. For kajongg this means it cannot use PyKDE4 until this is fixed. Until then, when running under Python3, it behaves like a simple Qt application (I wrote some simple replacements). I will sooner or later stop supporting Python2, so kajongg will stop behaving like a KDE application unless PyKF5 will be implemented without this bug. Status: confirmed again and again by myself. For python3 the test script is shorter: from PyKDE4.kdeui import KConfigSkeleton a = KConfigSkeleton() name = 'tilesetName' value = 'I am a value' s = a.addItemString(name, value) print(s.value())
The main problem is that: a. I don't really know where to look; b. I need to check how much Python code is inside the KConfigSkeleton SIP implementation I'll try to take a look soon, time permitting. I added Simon to the CC, hopefully he can give some pointers.
Fwiw, I cannot reproduce the issue (on fedora 24) with the test-case code posted here, https://www.riverbankcomputing.com/pipermail/pyqt/2016-October/038212.html
The test in the original comment does crash though (using python2)
What versions does Fedora 24 use? python, sip, qt4, pyqt4, pykde
$ rpm -q sip PyQt4 pykde4 qt python python3 sip-4.18-2.fc24.x86_64 PyQt4-4.11.4-14.fc24.x86_64 pykde4-4.14.3-12.fc24.x86_64 qt-4.8.7-18.fc24.x86_64 python-2.7.12-6.fc24.x86_64 python3-3.5.2-3.fc24.x86_64
On Kubuntu 16.10, the python3 script still exhibits this bug. python-kde 4.14.12 and 4.14.13 are identical. python-sip 4.18.1+dfsg-1 python-qt4 4.11.4+dfsg-2 python-kde4 4.14.2-0ubuntu6 libqtg4 4.8.7+dfsg-7ubuntu1 python 2.7.12-3build1 python 3.5.2-6
One thing I make sure to do in fedora, is that all sip-related bindings packages were rebuilt against sip-4.18 Hrm, I did test with sip-4.18, not 4.18.1 as you did, I wonder if that makes a difference
Hello, unfortunately this bug is being closed as unmaintained, per request of einar77.