[ python-Bugs-417833 ] pydoc HTTP reload failure

SourceForge.net noreply at sourceforge.net
Thu Nov 3 05:56:15 CET 2005


Bugs item #417833, was opened at 2001-04-21 07:10
Message generated for change (Comment added) made by ping
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=417833&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Python Library
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Garth T Kidd (gtk)
Assigned to: Ka-Ping Yee (ping)
Summary: pydoc HTTP reload failure

Initial Comment:
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. 

----------------------------------------------------------------------

>Comment By: Ka-Ping Yee (ping)
Date: 2005-11-02 20:56

Message:
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.

----------------------------------------------------------------------

Comment By: Russell Turpin (rturpin)
Date: 2005-10-31 09:16

Message:
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]


----------------------------------------------------------------------

Comment By: Eddie Parker (eparker)
Date: 2004-08-31 14:41

Message:
Logged In: YES 
user_id=991512

This is still current, as of 08/31/2004. Rather annoying,
too. :(

----------------------------------------------------------------------

Comment By: Brett Cannon (bcannon)
Date: 2003-05-16 16:43

Message:
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

----------------------------------------------------------------------

Comment By: Garth T Kidd (gtk)
Date: 2001-04-21 09:15

Message:
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
[...]


----------------------------------------------------------------------

Comment By: Garth T Kidd (gtk)
Date: 2001-04-21 08:09

Message:
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'>
>>> 


----------------------------------------------------------------------

Comment By: Garth T Kidd (gtk)
Date: 2001-04-21 07:58

Message:
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
...

----------------------------------------------------------------------

Comment By: Garth T Kidd (gtk)
Date: 2001-04-21 07:55

Message:
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...


----------------------------------------------------------------------

Comment By: Garth T Kidd (gtk)
Date: 2001-04-21 07:43

Message:
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. 

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=417833&group_id=5470


More information about the Python-bugs-list mailing list