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: pkgutil._iter_file_finder_modules should not be fooled by *.py folders
Type: behavior Stage:
Components: Library (Lib) Versions: Python 3.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: eric.snow, ncoghlan, wolma
Priority: normal Keywords: patch

Created on 2017-03-09 11:46 by wolma, last changed 2022-04-11 14:58 by admin.

Files
File name Uploaded Description Edit
pkgutil.patch wolma, 2017-03-09 11:46 review
Messages (2)
msg289285 - (view) Author: Wolfgang Maier (wolma) * Date: 2017-03-09 11:46
The current implementation of _iter_file_finder_modules parses folders with a valid Python module extension as modules (e.g. it would report a *folder* xy.py as a module xy).
As a result, e.g., pydoc.apropos('') fails if such a folder is found anywhere on sys.path.

I'm attaching a patch that fixes this and also brings a few minor improvements (like using a set instead of a dict with 1 values and reusing the function in ImpImporter).

However, I have a question about it (which is also the reason why I didn't turn this into a PR right away): in addition to checking that an item detected as a module is not a directory, I think it would be good to also check that an __init__ module inside a possible package really is a file. If I uncomment the respective check in the patch though, I'm getting a test_pydoc failure because the test creates a package directory with no access to contained file attributes. So even though there is an __init__.py file in the package dir the isfile() check fails. I think that should, in fact, happen and the pydoc test is wrong, but apparently whoever wrote the test had a different opinion.
Any thoughts?
msg289333 - (view) Author: Alyssa Coghlan (ncoghlan) * (Python committer) Date: 2017-03-10 02:04
I think there's an open issue somewhere pointing out that _iter_file_finder doesn't handle PEP 420 namespace packages correctly, precisely because it's still looking for an __init__.py file.

So I'd suggest not worry about changing the __init__.py handling here, and instead just add a new test case to test_pkgutil that fails with the old traversal code and passes with the new code.
History
Date User Action Args
2022-04-11 14:58:44adminsetgithub: 73955
2017-03-10 02:04:13ncoghlansetmessages: + msg289333
2017-03-09 18:28:55brett.cannonsetnosy: - brett.cannon
2017-03-09 13:56:52serhiy.storchakasetnosy: + brett.cannon, eric.snow
2017-03-09 11:46:10wolmacreate