Closed
Description
Hi, please consider the following SSCCE:
import matplotlib
matplotlib.use('MacOSX') # Segfault in backend from call to pyplot.show().
# matplotlib.use('TkAgg') # This backend does not reproduce the segfault.
import matplotlib.pyplot as plt
import numpy as np
import signal
from subprocess import Popen, PIPE
def mplayer_view(img):
mplayer = Popen(
['mplayer', '-',
'-demuxer', 'rawvideo',
'-rawvideo', 'w={}:h={}:format={}'.format(
img.shape[1], img.shape[0], 'y8')],
stdin=PIPE
)
tmp = img.astype('int8').tostring('C')
# Writing twice is important to reproduce the segfault (no flush needed).
mplayer.stdin.write(tmp)
mplayer.stdin.write(tmp)
mplayer.kill()
if __name__ == "__main__":
img = np.zeros((512,512)) # Need to write enough bytes.
mplayer_view(img)
plt.figure()
plt.show() # <-- segfault here
Running that with python
I get Segmentation fault: 11
Using faulthandler, the backtrace traces it to matplotlib's macosx backend from the call to show():
Fatal Python error: Segmentation fault
Current thread 0x00007fff7a0c4000 (most recent call first):
File "/Users/cmey/.pyenv/versions/chips-3.4.3/lib/python3.4/site-packages/matplotlib/backends/backend_macosx.py", line 29 in mainloop
File "/Users/cmey/.pyenv/versions/chips-3.4.3/lib/python3.4/site-packages/matplotlib/backend_bases.py", line 192 in __call__
File "/Users/cmey/.pyenv/versions/chips-3.4.3/lib/python3.4/site-packages/matplotlib/pyplot.py", line 244 in show
File "/Users/cmey/Code/python/test_matplotlib_segfault.py", line 35 in <module>
Segmentation fault: 11
I checked the return code from mplayer (with mplayer.wait()
), it is -9
as it should (I kill it). If it was mplayer that segfaulted, wait()
would return -11. Even if mplayer segfaults, that should not produce a segfault from matplotlib/Python.
I couldn't find another program than mplayer to pipe to, that reproduces the segfault.
Christophe
-- OSX, matplotlib version 1.5.1 from pip 8.1.2, Python 3.4.3 from pyenv, MPlayer 1.3.0-4.2.1