From f90e077c2b19360746443f2f1133e967ace2e08d Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Thu, 16 Oct 2025 18:52:37 +0200 Subject: [PATCH] [python] PY-84883 allow debugging modules with Python 3.14 - `pkgutil.get_loader()` was removed in Python 3.14 - switch to `importlib.util.find_spec()` instead (cherry picked from commit 688119f9a207eb2c204ddb89ac0770ab3d800956) IJ-MR-178861 GitOrigin-RevId: 7849bfab553c88318ee353f38c2b33224c5f4cb2 --- python/helpers/pydev/pydevd_file_utils.py | 28 +++++++++++-------- .../pydev/tests/test_pydevd_file_utils.py | 9 ++++++ 2 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 python/helpers/pydev/tests/test_pydevd_file_utils.py diff --git a/python/helpers/pydev/pydevd_file_utils.py b/python/helpers/pydev/pydevd_file_utils.py index 3762e251bd8c..0be5c9fc2220 100644 --- a/python/helpers/pydev/pydevd_file_utils.py +++ b/python/helpers/pydev/pydevd_file_utils.py @@ -611,19 +611,25 @@ def get_abs_path_real_path_and_base_from_frame(frame): def get_fullname(mod_name): - if IS_PY3K: - import pkgutil - else: - from _pydev_imps import _pydev_pkgutil_old as pkgutil try: + import importlib.util + + spec = importlib.util.find_spec(mod_name) + if spec is not None and spec.origin is not None: + return spec.origin + except ImportError: + pass + + if not IS_PY3K: + from _pydev_imps import _pydev_pkgutil_old as pkgutil + loader = pkgutil.get_loader(mod_name) - except: - return None - if loader is not None: - for attr in ("get_filename", "_get_filename"): - meth = getattr(loader, attr, None) - if meth is not None: - return meth(mod_name) + if loader is not None: + for attr in ("get_filename", "_get_filename"): + meth = getattr(loader, attr, None) + if meth is not None: + return meth(mod_name) + return None diff --git a/python/helpers/pydev/tests/test_pydevd_file_utils.py b/python/helpers/pydev/tests/test_pydevd_file_utils.py new file mode 100644 index 000000000000..14d23196baa4 --- /dev/null +++ b/python/helpers/pydev/tests/test_pydevd_file_utils.py @@ -0,0 +1,9 @@ +from pydevd_file_utils import get_fullname + + +def test_get_fullname_exists(): + assert get_fullname('pydevd_file_utils').endswith('pydevd_file_utils.py') + + +def test_get_fullname_unknown(): + assert get_fullname("hello_world") is None