Index: Lib/pydoc.py =================================================================== --- Lib/pydoc.py (revision 67313) +++ Lib/pydoc.py (working copy) @@ -52,7 +52,7 @@ # the current directory is changed with os.chdir(), an incorrect # path will be displayed. -import sys, imp, os, re, inspect, builtins, pkgutil +import sys, io, imp, os, re, inspect, builtins, pkgutil from reprlib import Repr try: from collections import deque @@ -1784,7 +1784,7 @@ return pager(doc.strip() + '\n') if xrefs: - import io, formatter + import formatter buffer = io.StringIO() formatter.DumbWriter(buffer).send_flowing_data( 'Related help topics: ' + ', '.join(xrefs.split()) + '\n') @@ -1869,29 +1869,13 @@ if key is None: callback(None, modname, '') else: - loader = importer.find_module(modname) - if hasattr(loader,'get_source'): - try: - source = loader.get_source(modname) - except UnicodeDecodeError: - if onerror: - onerror(modname) - continue - import io - desc = source_synopsis(io.StringIO(source)) or '' - if hasattr(loader,'get_filename'): - path = loader.get_filename(modname) - else: - path = None - else: - try: - module = loader.load_module(modname) - except ImportError: - if onerror: - onerror(modname) - continue - desc = (module.__doc__ or '').splitlines()[0] - path = getattr(module,'__file__',None) + try: + path, desc = self.find_module(importer, modname) + except Exception: + if onerror: + onerror(modname) + continue + name = modname + ' - ' + desc if name.lower().find(key) >= 0: callback(path, modname, desc) @@ -1899,6 +1883,22 @@ if completer: completer() + def find_module(self, importer, modname): + loader = importer.find_module(modname) + if hasattr(loader, 'get_source'): + source = loader.get_source(modname) + desc = source_synopsis(io.StringIO(source)) or '' + if hasattr(loader,'get_filename'): + path = loader.get_filename(modname) + else: + path = None + else: + module = loader.load_module(modname) + desc = (module.__doc__ or '').splitlines()[0] + path = getattr(module,'__file__',None) + return path, desc + + def apropos(key): """Print all the one-line module summaries that contain a substring.""" def callback(path, modname, desc):