Index: Lib/pydoc.py =================================================================== --- Lib/pydoc.py (revision 70253) +++ Lib/pydoc.py (working copy) @@ -1923,31 +1923,32 @@ 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) + if loader: + 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: - 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) - name = modname + ' - ' + desc - if name.lower().find(key) >= 0: - callback(path, modname, desc) + try: + module = loader.load_module(modname) + except ImportError: + if onerror: + onerror(modname) + continue + desc = (module.__doc__ or '').splitlines()[0] + path = getattr(module,'__file__',None) + name = modname + ' - ' + desc + if name.lower().find(key) >= 0: + callback(path, modname, desc) if completer: completer() Index: Lib/test/test_pydoc.py =================================================================== --- Lib/test/test_pydoc.py (revision 70253) +++ Lib/test/test_pydoc.py (working copy) @@ -189,8 +189,10 @@ output of pydoc. """ cmd = [sys.executable, pydoc.__file__, " ".join(args), module_name] - output = subprocess.Popen(cmd, stdout=subprocess.PIPE).stdout.read() - return output.strip() + output, error = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE).communicate() + return output.strip(), error.strip() def get_pydoc_html(module): "Returns pydoc generated output as html" @@ -249,12 +251,20 @@ def test_not_here(self): missing_module = "test.i_am_not_here" - result = str(run_pydoc(missing_module), 'ascii') + output, error = run_pydoc(missing_module) + result = str(output, 'ascii') expected = missing_pattern % missing_module self.assertEqual(expected, result, "documentation for missing module found") + def test_apropos(self): + module = "sys" + output, error = run_pydoc(module, "-k") + output = str(output, 'ascii') + error = str(error, 'ascii') + self.assert_(output and not error, 'documentation to stdout and nothing to stderr') + class TestDescriptions(unittest.TestCase): def test_module(self): Index: Lib/pkgutil.py =================================================================== --- Lib/pkgutil.py (revision 70253) +++ Lib/pkgutil.py (working copy) @@ -181,7 +181,7 @@ path = [os.path.realpath(self.path)] try: file, filename, etc = imp.find_module(subname, path) - except ImportError: + except (ImportError, SyntaxError): return None return ImpLoader(fullname, file, filename, etc)