This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: pydoc HTTP reload failure
Type: Stage:
Components: Library (Lib) Versions:
process
Status: closed Resolution:
Dependencies: Superseder:
Assigned To: ping Nosy List: brett.cannon, eparker, gtk, ping, rturpin
Priority: normal Keywords:

Created on 2001-04-21 14:10 by gtk, last changed 2022-04-10 16:03 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
DemonstratePydocBug.tar.gz gtk, 2001-04-21 14:10 package to demonstrate pydoc reload bug
DemonstratePydocBug2.tar.gz gtk, 2001-04-21 14:43 demonstration of second bug tickler
pydoc.py.patch ping, 2005-11-03 08:30 patch for pydoc.py (CVS revision 1.108)
pydoc.py.fixed ping, 2005-11-03 08:34 fixed version of pydoc.py
Messages (12)
msg4423 - (view) Author: Garth T Kidd (gtk) Date: 2001-04-21 14:10
pydoc, when run as a web server, can't cope with 
reloads of modules which use 'from Package import 
Module' syntax for imports. 

To reproduce: 

* extract the attached DemonstratePydocBug tarchive 
into your Python 2.1 directory

* python -c Lib\pydoc.py -p 8192

* visit http://localhost:8192/DemonstratePydocBug.html

The rest of the instructions are there. 

Demonstrated on Python 2.1 (#15, Apr 16 2001, 
18:25:49) [MSC 32 bit (Intel)] on win32. 

Funnily enough, there's no problem with trying the 
following under Python interactively: 

Python 2.1 (#15, Apr 16 2001, 18:25:49) [MSC 32 bit 
(Intel)] on win32
Type "copyright", "credits" or "license" for more 
information.
>>> import DemonstratePydocBug.ReloadFails
>>> import DemonstratePydocBug.ReloadFails
>>> import DemonstratePydocBug.ReloadFails
>>> import DemonstratePydocBug.ReloadFails

Python 2.1 (#15, Apr 16 2001, 18:25:49) [MSC 32 bit 
(Intel)] on win32
Type "copyright", "credits" or "license" for more 
information.
>>> from DemonstratePydocBug import ReloadFails
>>> from DemonstratePydocBug import ReloadFails
>>> from DemonstratePydocBug import ReloadFails
>>> from DemonstratePydocBug import ReloadFails

I'm dropping additional debugging code into pydoc.py 
to see if I can figure out what's going on. 
msg4424 - (view) Author: Garth T Kidd (gtk) Date: 2001-04-21 14:43
Logged In: YES 
user_id=59803

I've found another demonstration case. Noting that 

    from package import module

gives you a variable called 'module', whilst 

    import package.module

gives you a variable called 'package', I thought I'd try 
out another import syntax which wouldn't break code that 
was trying out the first option: 

    import package.module as module

This also works under the Python 2.1 interpreter but breaks 
pydoc 1.38. I've attached an updated demonstration 
tarchive. 
msg4425 - (view) Author: Garth T Kidd (gtk) Date: 2001-04-21 14:55
Logged In: YES 
user_id=59803

>>> import pydoc
>>> import DemonstratePydocBug
>>> pydoc.help(DemonstratePydocBug.Target)

... we get good stuff...

>>> print DemonstratePydocBug.ReloadFails2
<module 'DemonstratePydocBug.ReloadFails2' 
from 'DemonstratePydocBug\ReloadFails2.py'>
>>> pydoc.help(DemonstratePydocBug.ReloadFails2)

... we get good stuff...
msg4426 - (view) Author: Garth T Kidd (gtk) Date: 2001-04-21 14:58
Logged In: YES 
user_id=59803

WHOA. Belay that. I screwed up trying to run too many tests 
in a row without shutting down the interpreter. 

Python 2.1 (#15, Apr 16 2001, 18:25:49) [MSC 32 bit 
(Intel)] on win32
Type "copyright", "credits" or "license" for more 
information.
>>> import pydoc
>>> import DemonstratePydocBug
>>> pydoc.help(DemonstratePydocBug.Target)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'DemonstratePydocBug' module has no 
attribute 'Target'

Python 2.1 (#15, Apr 16 2001, 18:25:49) [MSC 32 bit 
(Intel)] on win32
Type "copyright", "credits" or "license" for more 
information.
>>> import pydoc
>>> import DemonstratePydocBug
>>> DemonstratePydocBug.Target
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'DemonstratePydocBug' module has no 
attribute 'Target'
>>> import DemonstratePydocBug.Target
>>> DemonstratePydocBug.Target
<module 'DemonstratePydocBug.Target' from 'c:\python21
\lib\DemonstratePydocBug\Target.pyc'>
>>> pydoc.help(DemonstratePydocBug.Target)
Help on module DemonstratePydocBug.Target:

NAME
    DemonstratePydocBug.Target

FILE
    c:\python21\lib\demonstratepydocbug\target.py

DESCRIPTION
    Target: module to help demonstrate the pydoc reload bug.
    See the docstring in __init__.py for full details.

    Reloading the description of this module in pydoc 
should work,
    but that's hardly unusual because it doesn't import 
*anything*.
    Try ReloadWorks and ReloadFails, instead.

DATA
    __file__ = r'c:\python21
\lib\DemonstratePydocBug\Target.pyc'
    __name__ = 'DemonstratePydocBug.Target'


>>> pydoc.help(DemonstratePydocBug.Target)
Help on module DemonstratePydocBug.Target:

NAME
    DemonstratePydocBug.Target
...
msg4427 - (view) Author: Garth T Kidd (gtk) Date: 2001-04-21 15:09
Logged In: YES 
user_id=59803

Yet another demonstration case: 

DemonstratePydocBug/TryThis.py: 

    import DemonstratePydocBug.Target 
    Target = DemonstratePydocBug.Target

This gives us a local Target variable, same as 'from 
DemonstratePydocBug import Target'. Pydoc barfs on this on 
the very first load. The traceback I hacked into pydoc 
claims:

Traceback (most recent call last):

  File "C:\Python21\Lib\pydoc.py", line 223, in safeimport
    module = __import__(path)

  File "c:\python21\lib\DemonstratePydocBug\TryThis.py", 
line 9, in ?
    Target = DemonstratePydocBug.Target

AttributeError: 'DemonstratePydocBug' module has no 
attribute 'Target'

In the interpreter, everything's fine with both techniques 
for getting Target: 

C:\Python21\thirdparty\MoinMoin>python
Python 2.1 (#15, Apr 16 2001, 18:25:49) [MSC 32 bit 
(Intel)] on win32
Type "copyright", "credits" or "license" for more 
information.
>>> from DemonstratePydocBug import Target
>>> Target
<module 'DemonstratePydocBug.Target' from 'c:\python21
\lib\DemonstratePydocBug\Target.pyc'>
>>> 

C:\Python21\thirdparty\MoinMoin>python
Python 2.1 (#15, Apr 16 2001, 18:25:49) [MSC 32 bit 
(Intel)] on win32
Type "copyright", "credits" or "license" for more 
information.
>>> import DemonstratePydocBug.Target
>>> Target = DemonstratePydocBug.Target
>>> Target
<module 'DemonstratePydocBug.Target' from 'c:\python21
\lib\DemonstratePydocBug\Target.pyc'>
>>> 
msg4428 - (view) Author: Garth T Kidd (gtk) Date: 2001-04-21 16:15
Logged In: YES 
user_id=59803

Using pydoc in the interpreter doesn't tickle any of these 
bugs, so hopefully I can narrow my focus down to the 
difference in handling between serve() and help(). 

Python 2.1 (#15, Apr 16 2001, 18:25:49) [MSC 32 bit 
(Intel)] on win32
Type "copyright", "credits" or "license" for more 
information.
>>> import pydoc
>>> pydoc.help

Welcome to Python 2.1!  This is the online help utility.
[...]

help> modules
Please wait a moment while I gather a list of all available 
modules...

[list of modules] 

Enter any module name to get more help.  Or, type "modules 
spam" to search for modules whose descriptions contain the 
word "spam".

help> DemonstratePydocBug.ReloadFails
Help on module DemonstratePydocBug.ReloadFails in 
DemonstratePydocBug:

NAME
    DemonstratePydocBug.ReloadFails

FILE
    c:\python21\lib\demonstratepydocbug\reloadfails.py
[...]

help> DemonstratePydocBug.TryThis
Help on module DemonstratePydocBug.TryThis in 
DemonstratePydocBug:

NAME
    DemonstratePydocBug.TryThis
[...]
msg4429 - (view) Author: Brett Cannon (brett.cannon) * (Python committer) Date: 2003-05-16 23:43
Logged In: YES 
user_id=357491

Just as an update, this still seeems to be an issue in Python 2.3b1 w/ version 
1.82 of pydoc
msg4430 - (view) Author: Eddie Parker (eparker) Date: 2004-08-31 21:41
Logged In: YES 
user_id=991512

This is still current, as of 08/31/2004. Rather annoying,
too. :(
msg4431 - (view) Author: Russell Turpin (rturpin) Date: 2005-10-31 17:16
Logged In: YES 
user_id=670280

There's a similar bug in Python 2.4. It causes the
__import__ function to throw an AttributeError exception
during safeimport(). I've patched our local copy of pydoc to
fix this. The patch is to the safeimport() function. The
patched lines are:

    # This keeps __import__ from throwing an exception on
reloads.
    # del sys.modules[path]      # This is sole original line
    module = sys.modules[path]   # Added this line
    try:                         # Added this line
        reload(module)           # Added this line
    except:                      # Added this line
        module = None            # Added this line
    return module                # Added this line

This replaces the line:

    del sys.modules[path]
msg4432 - (view) Author: Ka-Ping Yee (ping) * (Python committer) Date: 2005-11-03 04:56
Logged In: YES 
user_id=45338

I've been looking into this problem, and unfortunately,
the solution isn't as straightforward as rturpin's patch.

The (sorry, undocumented) original reason that safeimport
uses "del sys.modules[path]" instead of simply calling
reload() is that reload() leaves old variables around in the
module.  For example, if the module initially contains
"x = 3", it's loaded, the source file is changed to "y = 3",
and then reloaded, the resulting loaded module will contain
both x and y.  I'm working on a way to safely clear the module
without re-triggering the problem.
msg4433 - (view) Author: Ka-Ping Yee (ping) * (Python committer) Date: 2005-11-03 08:34
Logged In: YES 
user_id=45338

I've uploaded a fixed version of pydoc.py.  Please give it a try
and let me know if it works for you.  Thanks.
msg4434 - (view) Author: Ka-Ping Yee (ping) * (Python committer) Date: 2005-11-05 05:05
Logged In: YES 
user_id=45338

Fix has been committed to revision 41400.
History
Date User Action Args
2022-04-10 16:03:59adminsetgithub: 34386
2001-04-21 14:10:34gtkcreate