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 2011年04月24日 03:34 by okopnik, last changed 2022年04月11日 14:57 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| pydoc_crash_test | okopnik, 2011年04月27日 15:43 | pydoc crash test | ||
| pydoc_crash_test | okopnik, 2011年04月27日 17:27 | |||
| Messages (6) | |||
|---|---|---|---|
| msg134323 - (view) | Author: Ben Okopnik (okopnik) | Date: 2011年04月24日 03:34 | |
Long-standing problem (happens in every Python version I've tested). The usual situation is when invoking Python (and then "help('modules')") or "pydoc modules" in /tmp, but also happens when located anywhere with unreadable subdirs:
ben@Jotunheim:~$ mkdir /tmp/foo; cd /tmp/foo
ben@Jotunheim:/tmp/foo$ mkdir bar; sudo chmod 000 bar
[sudo] password for ben:
ben@Jotunheim:/tmp/foo$ pydoc modules
Please wait a moment while I gather a list of all available modules...
Traceback (most recent call last):
File "/usr/bin/pydoc2.6", line 5, in <module>
pydoc.cli()
File "/usr/lib/python2.6/pydoc.py", line 2309, in cli
help.help(arg)
File "/usr/lib/python2.6/pydoc.py", line 1765, in help
elif request == 'modules': self.listmodules()
File "/usr/lib/python2.6/pydoc.py", line 1886, in listmodules
ModuleScanner().run(callback, onerror=onerror)
File "/usr/lib/python2.6/pydoc.py", line 1937, in run
for importer, modname, ispkg in pkgutil.walk_packages(onerror=onerror):
File "/usr/lib/python2.6/pkgutil.py", line 105, in walk_packages
for importer, name, ispkg in iter_modules(path, prefix):
File "/usr/lib/python2.6/pkgutil.py", line 147, in iter_modules
for name, ispkg in iter_importer_modules(i, prefix):
File "/usr/lib/python2.6/pkgutil.py", line 211, in iter_modules
for fn in os.listdir(path):
OSError: [Errno 13] Permission denied: './bar'
Proposed patch:
Seems like an easy fix. In Python 3.1.2, change line 206 in /usr/lib/python3.1/pkgutil.py from
if not modname and os.path.isdir(path) and '.' not in fn:
to
if not modname and os.path.isdir(path) and '.' not in fn and os.access(path, os.R_OK):
Other versions much the same (although the specified line number will probably be different.)
Best regards,
Ben Okopnik
|
|||
| msg134586 - (view) | Author: Ben Okopnik (okopnik) | Date: 2011年04月27日 15:43 | |
Here's a test that should exercise every version of "pydoc" installed on the system: mkdir -p /tmp/foo/bar; cd /tmp/foo; chmod 0 bar for n in `whereis -b pydoc`; do echo "**** $n ****"; $n modules; done Tested under Ubuntu with bash and sh; should work fine with any Bourne-derived shell that supports 'whereis'. Please see attached file. |
|||
| msg134588 - (view) | Author: Éric Araujo (eric.araujo) * (Python committer) | Date: 2011年04月27日 15:49 | |
The script is bugged, since whereis prefixes its output with its argument (i.e. here "pydoc: "). It’s not a concern anyway: branches open for bugfixes are 2.7, 3.1, 3.2 and 3.3, so when we have a test (preferably as a patch to test_pydoc.py, see http://docs.python.org/devguide for more guidelines on testing and contributing) we check versions and fix where needed. |
|||
| msg134600 - (view) | Author: Ben Okopnik (okopnik) | Date: 2011年04月27日 17:27 | |
Trivial fix: please see attached. As to test_pydoc.py, I don't know the system well enough to fiddle with it, but something like this should work (untested):
def test_unreadable_dir(self):
''' pydoc should handle unreadable subdirs gracefully '''
@contextmanager
def mk_unreadable_dir():
top_level_dir = tempfile.mkdtemp()
bad_dir = tempfile.mkdtemp(dir=top_level_dir)
os.chmod(bad_dir, 0)
os.chdir(top_level_dir)
yield
os.removedirs(top_level_dir)
with mk_unreadable_dir():
doc = pydoc.render_doc('modules')
self.assertTrue("modules" in doc)
|
|||
| msg134617 - (view) | Author: Ben Okopnik (okopnik) | Date: 2011年04月27日 21:01 | |
Whoops... with all of that, I just realized that this bug should be filed against pkgutil, not pydoc (pydoc, of course, calls pkgutil to do the path resolution, which is where this crash occurs.) My bad. >>> import pkgutil >>> inst = pkgutil.ImpImporter(path='/tmp') >>> list(inst.iter_modules()) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.1/pkgutil.py", line 209, in iter_modules for fn in os.listdir(path): OSError: [Errno 13] Permission denied: '/tmp/orbit-gdm' |
|||
| msg145056 - (view) | Author: Ned Deily (ned.deily) * (Python committer) | Date: 2011年10月07日 06:08 | |
Thanks for your suggested code and test. Somewhat different fixes to pkgutil have been added by the changes for Issue7367 and a necessary backport of a fix for pydoc from 3.x to 2.7 was made for Issue7425. With these fixes in place, pydoc for 3.3.0, 3.2.3, and 2.7.3 should not exhibit these problems anymore. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:16 | admin | set | github: 56123 |
| 2011年10月07日 06:08:33 | ned.deily | set | status: open -> closed resolution: duplicate messages: + msg145056 superseder: pkgutil.walk_packages fails on write-only directory in sys.path stage: test needed -> resolved |
| 2011年08月06日 02:59:32 | ned.deily | set | assignee: ned.deily nosy: + ned.deily versions: - Python 3.1 |
| 2011年04月27日 21:01:39 | okopnik | set | messages: + msg134617 |
| 2011年04月27日 17:27:44 | okopnik | set | files:
+ pydoc_crash_test messages: + msg134600 |
| 2011年04月27日 15:49:30 | eric.araujo | set | messages: + msg134588 |
| 2011年04月27日 15:43:34 | okopnik | set | files:
+ pydoc_crash_test messages: + msg134586 |
| 2011年04月27日 08:50:26 | eric.araujo | set | nosy:
+ eric.araujo stage: test needed components: + Library (Lib), - Demos and Tools versions: - Python 2.6, Python 2.5, Python 3.4 |
| 2011年04月24日 03:34:52 | okopnik | create | |