From 777c0a67f70b9aeff55cfc70add2d56dfd577f10 Mon Sep 17 00:00:00 2001 From: Sebastian Ramacher Date: Wed, 29 Jan 2020 12:51:51 +0100 Subject: [PATCH 1/2] Immediately close file object --- bpython/importcompletion.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/bpython/importcompletion.py b/bpython/importcompletion.py index 6dea46125..35c2add66 100644 --- a/bpython/importcompletion.py +++ b/bpython/importcompletion.py @@ -43,6 +43,8 @@ SUFFIXES = importlib.machinery.all_suffixes() else: + import imp + SUFFIXES = [suffix for suffix, mode, type in imp.get_suffixes()] # The cached list of all known modules @@ -158,9 +160,15 @@ def find_modules(path): # Workaround for issue #166 continue try: + is_package = False with warnings.catch_warnings(): warnings.simplefilter("ignore", ImportWarning) fo, pathname, _ = imp.find_module(name, [path]) + if fo is not None: + fo.close() + else: + # Yay, package + is_package = True except (ImportError, IOError, SyntaxError): continue except UnicodeEncodeError: @@ -168,10 +176,7 @@ def find_modules(path): # invalid encoding continue else: - if fo is not None: - fo.close() - else: - # Yay, package + if is_package: for subname in find_modules(pathname): if subname != "__init__": yield "%s.%s" % (name, subname) From 596d5f1725e3e30d526723c938c152b1da6f6306 Mon Sep 17 00:00:00 2001 From: Sebastian Ramacher Date: Wed, 29 Jan 2020 13:52:33 +0100 Subject: [PATCH 2/2] Use importlib for Python 3 (fixes #791) --- bpython/importcompletion.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/bpython/importcompletion.py b/bpython/importcompletion.py index 35c2add66..0fbc46d58 100644 --- a/bpython/importcompletion.py +++ b/bpython/importcompletion.py @@ -32,7 +32,6 @@ current_from_import_import, ) -import imp import os import sys import warnings @@ -143,6 +142,10 @@ def find_modules(path): filenames = os.listdir(path) except EnvironmentError: filenames = [] + + if py3: + finder = importlib.machinery.FileFinder(path) + for name in filenames: if not any(name.endswith(suffix) for suffix in SUFFIXES): # Possibly a package @@ -163,12 +166,22 @@ def find_modules(path): is_package = False with warnings.catch_warnings(): warnings.simplefilter("ignore", ImportWarning) - fo, pathname, _ = imp.find_module(name, [path]) - if fo is not None: - fo.close() + if py3: + spec = finder.find_spec(name) + if spec is None: + continue + if spec.submodule_search_locations is not None: + pathname = spec.submodule_search_locations[0] + is_package = True + else: + pathname = spec.origin else: - # Yay, package - is_package = True + fo, pathname, _ = imp.find_module(name, [path]) + if fo is not None: + fo.close() + else: + # Yay, package + is_package = True except (ImportError, IOError, SyntaxError): continue except UnicodeEncodeError: