[PyKDE] Thread Support in 3.0.4 broke use of PyRun_SimpleFile

Robin Summerhill robinsummerhill at cyantechnology.com
Tue May 21 17:29:12 BST 2002


I'm embedding Python/PyQT in a C++/Qt app (Qt 3.0.3 + MSVC6 and Linux). I
want to allow the user to extend the app by writing 'macro' files in
Python/PyQT that are run by the app using PyRun_SimpleFile. The scheme I was
using worked fine with sip/PyQt3.1 but is broken with sip/PyQT3.2. (Of
course, it might be that my way of doing things is 'broken' :-) )

To check things out, I created a minimal C++/Qt app that just has a single
button on a dialog. Pressing the button calls the slot function below:

void MacroDialog::slotRunMacro()
	FILE* fp;
	fp = fopen("macro.py", "r");
	PyRun_SimpleFile(fp, "macro.py");

macro.py looks like this:

import qt
a = qt.QLabel("Hello", None)

Everything is fine the first time that you run the macro. However, the
second time you run it within the same session you get
'Py_FatalError("PyThreadState_Get: no current thread")' at line 236 of
pystate.c. The callstack shows that PyRun_SimpleFile is trying to call
PyImport_AddModule to create the '__main__' module. This calls
PyThreadGetState_Get() which bombs out because _PyThreadState_Current has
been set to NULL.

I'm pretty sure that _PyThreadState_Current has been set to NULL by a call
to SIP_UNBLOCK_THREADS in sipIsPyMethod(). I'm not that hot on Python thread
states and the new thread support in PyQT3.0.4 though .

Does anyone have a clue what is going on and whether it's me at fault or sip
or pyqt?

Thanks for any help,

More information about the PyQt mailing list