Issue417833
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.
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) * | 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) * | 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) * | 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) * | 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:59 | admin | set | github: 34386 |
2001-04-21 14:10:34 | gtk | create |