##// END OF EJS Templates
inputhook: disable CTRL+C when a hook is active....
inputhook: disable CTRL+C when a hook is active. On systems with 'readline', it's very likely to intercept a signal during a select() call. The default SIGINT handler will schedule a KeyboardInterrupt exception to be raised as soon as possible. If ctypes is used to install a Python callback for PyOS_InputHook, this will happen as soon as the bytecode execution starts, so even if the first instruction of the callback is a `try: ... except KeyboardInterrupt` clause, it's actually too late. As ctypes doesn't allow a Python callback to raise an exception, this ends up with IPython detecting an internal error... not pretty. We must therefore ignore the SIGINT signals until we are sure the exception handler is active, in the Python callback.

File last commit:

r4259:657a41be
r4944:0fc80df3
Show More
qt_for_kernel.py
87 lines | 2.8 KiB | text/x-python | PythonLexer
""" Import Qt in a manner suitable for an IPython kernel.
This is the import used for the `gui=qt` or `pylab=qt` initialization.
Import Priority:
if matplotlib has been imported and doesn't support v2 (<= 1.0.1):
use PyQt4 @v1
Next, ask ETS' QT_API env variable
if QT_API not set:
ask matplotlib via rcParams['backend.qt4']
if it said PyQt:
use PyQt4 @v1
elif it said PySide:
use PySide
else: (matplotlib said nothing)
# this is the default path - nobody told us anything
try:
PyQt @v1
except:
fallback on PySide
else:
use PyQt @v2 or PySide, depending on QT_API
because ETS doesn't work with PyQt @v1.
"""
import os
import sys
from IPython.utils.warn import warn
matplotlib = sys.modules.get('matplotlib')
if matplotlib and matplotlib.__version__ <= '1.0.1':
# 1.0.1 doesn't support pyside or v2, so stick with PyQt @v1,
# and ignore everything else
from PyQt4 import QtCore, QtGui
else:
# ask QT_API ETS variable *first*
QT_API = os.environ.get('QT_API', None)
if QT_API is None:
# QT_API not set, ask matplotlib if it was imported (e.g. `pylab=qt`)
if matplotlib:
mpqt = matplotlib.rcParams.get('backend.qt4', None)
else:
mpqt = None
if mpqt is None:
# matplotlib not imported or had nothing to say.
try:
# default to unconfigured PyQt4
from PyQt4 import QtCore, QtGui
except ImportError:
# fallback on PySide
try:
from PySide import QtCore, QtGui
except ImportError:
raise ImportError('Cannot import PySide or PyQt4')
elif mpqt.lower() == 'pyqt4':
# import PyQt4 unconfigured
from PyQt4 import QtCore, QtGui
elif mpqt.lower() == 'pyside':
from PySide import QtCore, QtGui
else:
raise ImportError("unhandled value for backend.qt4 from matplotlib: %r"%mpqt)
else:
# QT_API specified, use PySide or PyQt+v2 API from external.qt
# this means ETS is likely to be used, which requires v2
try:
from IPython.external.qt import QtCore, QtGui
except ValueError as e:
if 'API' in str(e):
# PyQt4 already imported, and APIv2 couldn't be set
# Give more meaningful message, and warn instead of raising
warn("""
Assigning the ETS variable `QT_API=pyqt` implies PyQt's v2 API for
QString and QVariant, but PyQt has already been imported
with v1 APIs. You should unset QT_API to work with PyQt4
in its default mode.
""")
# allow it to still work
from PyQt4 import QtCore, QtGui
else:
raise