| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| mod = importlib.util.module_from_spec(spec) | ||
| importer.exec_module(mod) | ||
| self.assertEqual(mod.foo(), "foo") | ||
|
|
There was a problem hiding this comment.
If here test the namespace module in zip, mkdir() must be removed, this bug is triggered by no directory entry in zip.
And don't do test via zipimport, that always fail/succeed, because find functons depend the loader's path prefix. Direct import namespace module can cover all cases.
Sorry, something went wrong.
There was a problem hiding this comment.
I'm a bit confused on what you want here - the test passes, why should mkdir() be removed?
Sorry, something went wrong.
There was a problem hiding this comment.
Again, this bug is triggered by no directory entry in zip. If the directory entry is already exists, everything is OK.
Sorry, something went wrong.
| # OK, we found it the old way. Let's return it. | ||
| return path | ||
|
|
||
| return self.prefix + fullname.replace(".", path_sep) |
There was a problem hiding this comment.
As https://github.com/python/cpython/pull/121161/files#r1660062444 described, this patch has no effect, shoud patch _is_dir or _read_directory.
Sorry, something went wrong.
There was a problem hiding this comment.
As https://github.com/python/cpython/pull/121161/files#r1660062444 described, this patch has no effect, shoud patch _is_dir or _read_directory.
From what I found, there's no problem with _read_directory, and _is_dir is only relevant to find_spec (the problem still occurs in get_code, for example). This patch seems to fix the issue for both. Have you tried this fix on this issue?
Sorry, something went wrong.
There was a problem hiding this comment.
For namespace package's dealing and operation, there has already clearly explained in the source code comment. You can see them in find_loader (<=py311), find_spec and _is_dir.
And, why your test with get_code (and get_filename, get_source, is_package also) was fail? Because find functons depend the loader's path prefix, different level modules have different level loaders, skip levels will be failed. Yes, this is _get_module_path which you patched, then it broken, return the full path at once instead of stepwise lookup.
If you like to test into zipimport functions, it should be get_data:
def testImportSubmodulesInZip(self):
with ZipFile(TEMP_ZIP, "w") as z:
z.writestr("a/__init__.py", b'')
z.writestr("a/b/c/__init__.py", b'def foo(): return "foo"')
importer = zipimport.zipimporter(TEMP_ZIP + "/a/")
spec = importer.find_spec("a.b")
self.assertEqual(spec.loader, None)
self.assertEqual(spec.submodule_search_locations,
[(TEMP_ZIP + "/a/b").replace("/", zipimport.path_sep)])
self.assertRaises(zipimport.ZipImportError, importer.get_code, "a.b")
self.assertEqual(importer.get_data("a/b/"), b"")
sys.path.insert(0, TEMP_ZIP)
try:
import a.b.c
self.assertIn('namespace', str(a.b).lower())
self.assertEqual(a.b.c.foo(), "foo")
finally:
del sys.path[0]
sys.modules.pop('a.b.c', None)
sys.modules.pop('a.b', None)
sys.modules.pop('a', None)
Sorry, something went wrong.
Sorry, something went wrong.
|
This fix worked, Thank you so much. |
Sorry, something went wrong.
|
@serhiy-storchaka Could you take look at the testcase and patch? |
Sorry, something went wrong.
|
Can confirm that the test written by @SeaHOH continues to fail on the new patch. There were two bugs at play here, I only patched one of them (my original test case fails on the main branch, as of now). The underlying problem is not directly with _is_dir, but it's that _read_directory doesn't have a way to represent empty directories. AFAIK, find_spec is only affected by this now. |
Sorry, something went wrong.
|
Sorry for my English is so bad. Seems #121233 fixed the bug. |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.