[PyKDE] Thread Support in 3.0.4 broke use of PyRun_SimpleFile

Phil Thompson phil at river-bank.demon.co.uk
Tue May 21 18:20:01 BST 2002


Robin Summerhill wrote:
> 
> Hi,
> 
> 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");
>         fclose(fp);
> }
> 
> macro.py looks like this:
> 
> import qt
> a = qt.QLabel("Hello", None)
> a.show()
> 
> 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?

I'm fairly confident that the thread handling in SIP/PyQt 3.2.x is
correct. It was certainly very broken in 3.1. Of course, embedding PyQt
in a C++ application is a slightly different situation.

BTW, you are aware that all your users will need to have their own Qt
licence?

Phil




More information about the PyQt mailing list