matplotlib with Qt4 backend

I just installed matplotlib on Snow Leopard 10.6 with the Qt4 backend (via macports). However, when I try one of the Qt4 examles:

python /opt/local/share/py26-matplotlib/examples/user_interfaces/embedding_in_qt4.py

I get the following error message:

Traceback (most recent call last):
File “/opt/local/share/py26-matplotlib/examples/user_interfaces/embedding_in_qt4.py”, line 70, in update_figure

self.draw()

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/backends/backend_qt4agg.py”, line 130, in draw
FigureCanvasAgg.draw(self)
File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/backends/backend_agg.py”, line 314, in draw

self.figure.draw(self.renderer)

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/artist.py”, line 46, in draw_wrapper
draw(artist, renderer, *kl)

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/figure.py”, line 773, in draw
for a in self.axes: a.draw(renderer)
File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/artist.py”, line 46, in draw_wrapper

draw(artist, renderer, *kl)

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/axes.py”, line 1735, in draw
a.draw(renderer)
File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/artist.py”, line 46, in draw_wrapper

draw(artist, renderer, *kl)

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/axis.py”, line 742, in draw
tick.draw(renderer)
File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/artist.py”, line 46, in draw_wrapper

draw(artist, renderer, *kl)

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/axis.py”, line 196, in draw
self.label1.draw(renderer)
File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/text.py”, line 515, in draw

bbox, info = self._get_layout(renderer)

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/text.py”, line 272, in _get_layout
‘lp’, self._fontproperties, ismath=False)

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/backends/backend_agg.py”, line 158, in get_text_width_height_descent
font = self._get_agg_font(prop)

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/backends/backend_agg.py”, line 195, in _get_agg_font
fname = findfont(prop)
File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/font_manager.py”, line 1308, in findfont

_rebuild()

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/font_manager.py”, line 1292, in _rebuild
fontManager = FontManager()
File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/font_manager.py”, line 984, in init

self.ttffiles = findSystemFonts(paths) + findSystemFonts()

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/font_manager.py”, line 341, in findSystemFonts

for f in get_fontconfig_fonts(fontext):

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/font_manager.py”, line 303, in get_fontconfig_fonts
status, output = commands.getstatusoutput(“fc-list file”)

File “/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/commands.py”, line 56, in getstatusoutput
text = pipe.read()
IOError: [Errno 4] Interrupted system call

Any ideas on what could be causing this?

celil

Celil Rufat wrote:

I just installed matplotlib on Snow Leopard 10.6 with the Qt4 backend (via macports). However, when I try one of the Qt4 examles:

python /opt/local/share/py26-matplotlib/examples/user_interfaces/embedding_in_qt4.py

IOError: [Errno 4] Interrupted system call

Any ideas on what could be causing this?

Out of curiosity, does anyone know where the signal interrupting the system call is originating? Is this a standard communication mechanism within Qt4? (I have never used Qt4.) I'm interested in knowing about OSS that use signals as a means of across-thread or across-process communication.

This problem arises when signal handlers are installed, not necessarily when a signal itself is sent (dtrace doesn't detect any). PyQt4 doesn't do it, but I think something in QApplication does. I really don't know what, though. Here are the files that call signal(3) or sigaction(3):

./src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c
./src/3rdparty/phonon/qt7/quicktimevideoplayer.mm
./src/3rdparty/sqlite/shell.c
./src/3rdparty/webkit/JavaScriptCore/jsc.cpp
./src/corelib/io/qfilesystemwatcher_dnotify.cpp
./src/corelib/io/qprocess_unix.cpp
./src/corelib/kernel/qcrashhandler.cpp
./src/corelib/kernel/qeventdispatcher_unix.cpp
./src/gui/embedded/qwindowsystem_qws.cpp
./src/gui/embedded/qwssignalhandler.cpp
./tools/qvfb/main.cpp

It's not obvious to me that any of these are activated on OS X (the qcrashhandler.cpp file is intriguing, but it only seems to be used in the X11 QApplication). dtrace doesn't actually show either signal(3) or sigaction(3) being called at all. Actually, running a program under dtrace while probing those functions makes the problem go away. Sometimes.

···

On 2009-11-12 12:05 PM, Andrew Straw wrote:

Celil Rufat wrote:

I just installed matplotlib on Snow Leopard 10.6 with the Qt4 backend
(via macports). However, when I try one of the Qt4 examles:

python
/opt/local/share/py26-matplotlib/examples/user_interfaces/embedding_in_qt4.py

IOError: [Errno 4] Interrupted system call

Any ideas on what could be causing this?

Out of curiosity, does anyone know where the signal interrupting the
system call is originating? Is this a standard communication mechanism
within Qt4? (I have never used Qt4.) I'm interested in knowing about OSS
that use signals as a means of across-thread or across-process
communication.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco

Robert Kern wrote:

  

Celil Rufat wrote:
    

I just installed matplotlib on Snow Leopard 10.6 with the Qt4 backend
(via macports). However, when I try one of the Qt4 examles:

python
/opt/local/share/py26-matplotlib/examples/user_interfaces/embedding_in_qt4.py

IOError: [Errno 4] Interrupted system call

Any ideas on what could be causing this?
      

Out of curiosity, does anyone know where the signal interrupting the
system call is originating? Is this a standard communication mechanism
within Qt4? (I have never used Qt4.) I'm interested in knowing about OSS
that use signals as a means of across-thread or across-process
communication.
    
This problem arises when signal handlers are installed, not necessarily when a signal itself is sent (dtrace doesn't detect any).

Hmm, but a system call isn't going to get interrupted and return EINTR by any means other than a signal. So the OP must have had a signal interrupting the call and it must have come from somewhere. Or... am I wrong?

PyQt4 doesn't do it, but I think something in QApplication does. I really don't know what, though. Here are the files that call signal(3) or sigaction(3):

./src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c
./src/3rdparty/phonon/qt7/quicktimevideoplayer.mm
./src/3rdparty/sqlite/shell.c
./src/3rdparty/webkit/JavaScriptCore/jsc.cpp
./src/corelib/io/qfilesystemwatcher_dnotify.cpp
./src/corelib/io/qprocess_unix.cpp
./src/corelib/kernel/qcrashhandler.cpp
./src/corelib/kernel/qeventdispatcher_unix.cpp
./src/gui/embedded/qwindowsystem_qws.cpp
./src/gui/embedded/qwssignalhandler.cpp
./tools/qvfb/main.cpp

It's not obvious to me that any of these are activated on OS X (the qcrashhandler.cpp file is intriguing, but it only seems to be used in the X11 QApplication). dtrace doesn't actually show either signal(3) or sigaction(3) being called at all. Actually, running a program under dtrace while probing those functions makes the problem go away. Sometimes.
  

Ahh, a fun Heisenbug. OK, well if I decide to look for programs that use signals as a means of communication, I'll investigate Qt further.

I asked because there's a proprietary library I'm forced to use that does communicate internally with signals. It's a real pain, however, because it means anything else in that process also gets hit with signals and so system calls must be EINTR safe.

-Andrew

···

On 2009-11-12 12:05 PM, Andrew Straw wrote:

Well, SIGCHLD is sent by the OS when the child process completes. There is a SIGCHLD handler registered in ./src/corelib/io/qprocess_unix.cpp . I'm not sure how to avoid it, though.

I think I can verify this now:

$ really dtrace -n 'proc:::signal-handle /pid==$target/ { ustack(); printf("Signal: %d\n", arg0);}' -c "python application.py"
dtrace: description 'proc:::signal-handle ' matched 2 probes
Traceback (most recent call last):
   File "application.py", line 247, in <module>
     commands.getstatusoutput( "otool -L %s | grep libedit" % _rl.__file__ )
   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/commands.py", line 54, in getstatusoutput
     text = pipe.read()
IOError: [Errno 4] Interrupted system call
dtrace: pid 47973 has exited
CPU ID FUNCTION:NAME
   1 18577 sendsig:signal-handle
               libSystem.B.dylib`read+0xa
               libSystem.B.dylib`__srefill+0x127
               libSystem.B.dylib`fread+0x9f
               0x1c2d9b
               0x23affa
               0x23bde1
               0x23c7fa
               0x23c907
               0x260d37
               0x2610e3
               0x26f855
               python`0x1f82
               python`0x1ea9
               0x2
Signal: 20

$ python -c "import signal;print signal.SIGCHLD"
20

So it is getting SIGCHLD. I think my previous probes weren't getting signals from the OS itself.

···

On 2009-11-12 16:44 PM, Andrew Straw wrote:

Robert Kern wrote:

On 2009-11-12 12:05 PM, Andrew Straw wrote:

Celil Rufat wrote:

I just installed matplotlib on Snow Leopard 10.6 with the Qt4 backend
(via macports). However, when I try one of the Qt4 examles:

python
/opt/local/share/py26-matplotlib/examples/user_interfaces/embedding_in_qt4.py

IOError: [Errno 4] Interrupted system call

Any ideas on what could be causing this?

Out of curiosity, does anyone know where the signal interrupting the
system call is originating? Is this a standard communication mechanism
within Qt4? (I have never used Qt4.) I'm interested in knowing about OSS
that use signals as a means of across-thread or across-process
communication.

This problem arises when signal handlers are installed, not necessarily when a
signal itself is sent (dtrace doesn't detect any).

Hmm, but a system call isn't going to get interrupted and return EINTR
by any means other than a signal. So the OP must have had a signal
interrupting the call and it must have come from somewhere. Or... am I
wrong?

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco