##// END OF EJS Templates
Handle OSError cases where traceback frames occur from built files (#13964)...
Handle OSError cases where traceback frames occur from built files (#13964) I've been using the `_render_traceback_` method of the traceback object, provided by the `IPython.core.interactiveshell.InteractiveShell` object that you created, in the `showtraceback` method. Thanks to this, I was able to create better error messages. I appreciate it. The following issue is related to the use of this method. ```python try: # Exception classes can customise their traceback - we # use this in IPython.parallel for exceptions occurring # in the engines. This should return a list of strings. if hasattr(value, "_render_traceback_"): stb = value._render_traceback_() else: stb = self.InteractiveTB.structured_traceback( etype, value, tb, tb_offset=tb_offset ) ``` I noticed that in the recent `8.11` version, code was added to generate a traceback when the source code is too long. In this case, if the `etb.tb_frame` object is a built file or something similar, the `inspect.getsourcelines(etb.tb_frame)` method may raise an error. So I implemented a change to set the `max_len` to the minimum value and avoid the following condition when an `OSError` occurs. I think this approach can handle cases where errors occur while using the `inspect.getsourcelines()` method. If there is anything I have done wrong or any procedures I should follow, please let me know. I would greatly appreciate it if you could leave a comment and I will make the necessary changes immediately. Thank you.

File last commit:

r28148:e48e8d80
r28196:92027083 merge
Show More
test_pt_inputhooks.py
50 lines | 1.6 KiB | text/x-python | PythonLexer
import os
import importlib
import pytest
from IPython.terminal.pt_inputhooks import set_qt_api, get_inputhook_name_and_func
guis_avail = []
def _get_qt_vers():
"""If any version of Qt is available, this will populate `guis_avail` with 'qt' and 'qtx'. Due
to the import mechanism, we can't import multiple versions of Qt in one session."""
for gui in ["qt", "qt6", "qt5"]:
print(f"Trying {gui}")
try:
set_qt_api(gui)
importlib.import_module("IPython.terminal.pt_inputhooks.qt")
guis_avail.append(gui)
if "QT_API" in os.environ.keys():
del os.environ["QT_API"]
except ImportError:
pass # that version of Qt isn't available.
except RuntimeError:
pass # the version of IPython doesn't know what to do with this Qt version.
_get_qt_vers()
@pytest.mark.skipif(
len(guis_avail) == 0, reason="No viable version of PyQt or PySide installed."
)
def test_inputhook_qt():
# Choose the "best" Qt version.
gui_ret, _ = get_inputhook_name_and_func("qt")
assert gui_ret != "qt" # you get back the specific version that was loaded.
assert gui_ret in guis_avail
if len(guis_avail) > 2:
# ...and now we're stuck with this version of Qt for good; can't switch.
for not_gui in ["qt6", "qt5"]:
if not_gui != gui_ret:
break
# Try to import the other gui; it won't work.
gui_ret2, _ = get_inputhook_name_and_func(not_gui)
assert gui_ret2 == gui_ret
assert gui_ret2 != not_gui