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 2019年04月27日 08:04 by jaraco, last changed 2022年04月11日 14:59 by admin. This issue is now closed.
| Messages (2) | |||
|---|---|---|---|
| msg340975 - (view) | Author: Jason R. Coombs (jaraco) * (Python committer) | Date: 2019年04月27日 08:04 | |
As discovered in https://github.com/pypa/packaging-problems/issues/212, if a PEP 420 namespace package is represented by an implicit directory (that is, there's no explicit entry for the directory, only entries for the contents of the directory), that directory won't be picked up as a namespace package. The following code illustrates the issue: ``` zp $ cat make-pkgs.py import zipfile def make_pkgs(): zf = zipfile.ZipFile('simple.zip', 'w') zf.writestr('pkg/__init__.py', b'') zf.close() zf = zipfile.ZipFile('namespace.zip', 'w') zf.writestr('ns/pkg/__init__.py', b'') zf.close() __name__ == '__main__' and make_pkgs() zp $ python make-pkgs.py zp $ env PYTHONPATH=simple.zip python3.7 -c "import pkg" zp $ env PYTHONPATH=namespace.zip python3.7 -c "import ns.pkg" Traceback (most recent call last): File "<string>", line 1, in <module> ModuleNotFoundError: No module named 'ns' ``` As you can see, in simple.zip, the `pkg` directory is implied, but despite that condition, `pkg` is importable. However, with namespace.zip, the name `ns` is not visible even though it's present in the zipfile and would be importable if that zipfile were extracted to a file system. ``` zp $ unzip namespace.zip Archive: namespace.zip extracting: ns/pkg/__init__.py zp $ python3.7 -c "import ns.pkg" && echo done done ``` If you were to reconstruct that zip file on the file system using standard tools or explicitly include 'ns/' in the zip entries, the namespace package becomes visible: ``` zp $ rm namespace.zip zp $ zip -r namespace.zip ns adding: ns/ (stored 0%) adding: ns/pkg/ (stored 0%) adding: ns/pkg/__init__.py (stored 0%) adding: ns/pkg/__pycache__/ (stored 0%) adding: ns/pkg/__pycache__/__init__.cpython-37.pyc (deflated 23%) zp $ rm -r ns zp $ env PYTHONPATH=namespace.zip python3.7 -c "import ns.pkg" && echo done done ``` For consistency, the zip import logic should probably honor implicit directories in zip files. |
|||
| msg341033 - (view) | Author: Eric V. Smith (eric.smith) * (Python committer) | Date: 2019年04月28日 19:22 | |
This is a duplicate of issue 14905. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:59:14 | admin | set | github: 80921 |
| 2019年04月30日 22:54:18 | barry | set | nosy:
+ barry |
| 2019年04月28日 20:52:26 | jaraco | set | status: open -> closed resolution: duplicate superseder: zipimport needs to support namespace packages when no 'directory' entry exists stage: resolved |
| 2019年04月28日 19:22:09 | eric.smith | set | nosy:
+ eric.smith messages: + msg341033 |
| 2019年04月27日 08:04:15 | jaraco | create | |