mirror of
https://github.com/jupyter/docker-stacks.git
synced 2025-10-19 07:52:56 +00:00
Merge pull request #236 from parente/mpl-inline
Default matplotlib to inline backend
This commit is contained in:
@@ -15,6 +15,8 @@ RUN apt-get update && \
|
|||||||
USER $NB_USER
|
USER $NB_USER
|
||||||
|
|
||||||
# Install Python 3 packages
|
# Install Python 3 packages
|
||||||
|
# Remove pyqt and qt pulled in for matplotlib since we're only ever going to
|
||||||
|
# use notebook-friendly backends in these images
|
||||||
RUN conda install --quiet --yes \
|
RUN conda install --quiet --yes \
|
||||||
'ipywidgets=5.1*' \
|
'ipywidgets=5.1*' \
|
||||||
'pandas=0.18*' \
|
'pandas=0.18*' \
|
||||||
@@ -32,12 +34,15 @@ RUN conda install --quiet --yes \
|
|||||||
'dill=0.2*' \
|
'dill=0.2*' \
|
||||||
'numba=0.23*' \
|
'numba=0.23*' \
|
||||||
'bokeh=0.11*' \
|
'bokeh=0.11*' \
|
||||||
'h5py=2.5*' \
|
'h5py=2.5*' && \
|
||||||
&& conda clean -tipsy
|
conda remove --quiet --yes --force qt pyqt && \
|
||||||
|
conda clean -tipsy
|
||||||
# Activate ipywidgets extension in the environment that runs the notebook server
|
# Activate ipywidgets extension in the environment that runs the notebook server
|
||||||
RUN jupyter nbextension enable --py widgetsnbextension --sys-prefix
|
RUN jupyter nbextension enable --py widgetsnbextension --sys-prefix
|
||||||
|
|
||||||
# Install Python 2 packages
|
# Install Python 2 packages
|
||||||
|
# Remove pyqt and qt pulled in for matplotlib since we're only ever going to
|
||||||
|
# use notebook-friendly backends in these images
|
||||||
RUN conda create --quiet --yes -p $CONDA_DIR/envs/python2 python=2.7 \
|
RUN conda create --quiet --yes -p $CONDA_DIR/envs/python2 python=2.7 \
|
||||||
'ipython=4.2*' \
|
'ipython=4.2*' \
|
||||||
'ipywidgets=5.1*' \
|
'ipywidgets=5.1*' \
|
||||||
@@ -57,12 +62,17 @@ RUN conda create --quiet --yes -p $CONDA_DIR/envs/python2 python=2.7 \
|
|||||||
'numba=0.23*' \
|
'numba=0.23*' \
|
||||||
'bokeh=0.11*' \
|
'bokeh=0.11*' \
|
||||||
'h5py=2.5*' \
|
'h5py=2.5*' \
|
||||||
'pyzmq' \
|
'pyzmq' && \
|
||||||
&& conda clean -tipsy
|
conda remove -n python2 --quiet --yes --force qt pyqt && \
|
||||||
|
conda clean -tipsy
|
||||||
# Add shortcuts to distinguish pip for python2 and python3 envs
|
# Add shortcuts to distinguish pip for python2 and python3 envs
|
||||||
RUN ln -s $CONDA_DIR/envs/python2/bin/pip $CONDA_DIR/bin/pip2 && \
|
RUN ln -s $CONDA_DIR/envs/python2/bin/pip $CONDA_DIR/bin/pip2 && \
|
||||||
ln -s $CONDA_DIR/bin/pip $CONDA_DIR/bin/pip3
|
ln -s $CONDA_DIR/bin/pip $CONDA_DIR/bin/pip3
|
||||||
|
|
||||||
|
# Configure ipython kernel to use matplotlib inline backend by default
|
||||||
|
RUN mkdir -p $HOME/.ipython/profile_default/startup
|
||||||
|
COPY mplimporthook.py $HOME/.ipython/profile_default/startup/
|
||||||
|
|
||||||
USER root
|
USER root
|
||||||
|
|
||||||
# Install Python 2 kernel spec globally to avoid permission problems when NB_UID
|
# Install Python 2 kernel spec globally to avoid permission problems when NB_UID
|
||||||
|
55
scipy-notebook/mplimporthook.py
Normal file
55
scipy-notebook/mplimporthook.py
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
"""Startup script for IPython kernel.
|
||||||
|
|
||||||
|
Installs an import hook to configure the matplotlib backend on the fly.
|
||||||
|
|
||||||
|
Originally from @minrk at
|
||||||
|
https://github.com/minrk/profile_default/blob/master/startup/mplimporthook.py
|
||||||
|
Repurposed for docker-stacks to address repeat bugs like
|
||||||
|
https://github.com/jupyter/docker-stacks/issues/235.
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
from IPython import get_ipython
|
||||||
|
|
||||||
|
class MatplotlibFinder(object):
|
||||||
|
"""Import hook that notices when matplotlib.pyplot or pylab is imported
|
||||||
|
and tries to configure the matplotlib backend appropriately for the
|
||||||
|
environment.
|
||||||
|
"""
|
||||||
|
_called = False
|
||||||
|
|
||||||
|
def find_module(self, fullname, path=None):
|
||||||
|
if self._called:
|
||||||
|
# already handled
|
||||||
|
return
|
||||||
|
|
||||||
|
if fullname not in ('pylab', 'matplotlib.pyplot'):
|
||||||
|
# not matplotlib
|
||||||
|
return
|
||||||
|
|
||||||
|
# don't call me again
|
||||||
|
self._called = True
|
||||||
|
|
||||||
|
try:
|
||||||
|
# remove myself from the import hooks
|
||||||
|
sys.meta_path = [loader for loader in sys.meta_path if loader is not self]
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
ip = get_ipython()
|
||||||
|
if ip is None:
|
||||||
|
# not in an interactive environment
|
||||||
|
return
|
||||||
|
|
||||||
|
if ip.pylab_gui_select:
|
||||||
|
# backend already selected
|
||||||
|
return
|
||||||
|
|
||||||
|
if hasattr(ip, 'kernel'):
|
||||||
|
# default to inline in kernel environments
|
||||||
|
ip.enable_matplotlib('inline')
|
||||||
|
else:
|
||||||
|
print('enabling matplotlib')
|
||||||
|
ip.enable_matplotlib()
|
||||||
|
|
||||||
|
# install the finder immediately
|
||||||
|
sys.meta_path.insert(0, MatplotlibFinder())
|
Reference in New Issue
Block a user