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: from relative_module import seems to import wrong module
Type: behavior Stage: resolved
Components: Interpreter Core Versions: Python 3.3, Python 2.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: ethan.glasser.camp, r.david.murray
Priority: normal Keywords:

Created on 2013-10-09 18:18 by ethan.glasser.camp, last changed 2022-04-11 14:57 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
__init__.py ethan.glasser.camp, 2013-10-09 18:18
Messages (3)
msg199320 - (view) Author: Ethan Glasser-Camp (ethan.glasser.camp) Date: 2013-10-09 18:18
I have a library lib. lib/__init__.py does the following:

    from .subdir import a
    from . import a
    import sys

    print(sys.modules['lib.a'])

This code fails with a KeyError. It seems that despite the second line, lib.a does not get imported. Printing a.__name__ shows lib.subdir.a. Commenting out the first line makes the code work fine, as does moving the code from lib/__init__.py to lib/api.py. This happens under both Python 2.7 and Python 3.3.

Here is my sys.path, sys.meta_path, and sys.path_hooks under Python 2.7:

(['/home/ethan/tmp/import-madness', '/home/ethan/tmp/software/notmuch/bindings/python', '/home/ethan/local/lib/python2.7/site-packages', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/ethan/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7'], [], [<type 'zipimport.zipimporter'>])

The same under Python 3:

['/home/ethan/tmp/import-madness', '/home/ethan/local/lib/python2.7/site-packages', '/usr/lib/python3.3', '/usr/lib/python3.3/plat-x86_64-linux-gnu', '/usr/lib/python3.3/lib-dynload', '/usr/local/lib/python3.3/dist-packages', '/usr/lib/python3/dist-packages'] [<class '_frozen_importlib.BuiltinImporter'>, <class '_frozen_importlib.FrozenImporter'>, <class '_frozen_importlib.PathFinder'>] [<class 'zipimport.zipimporter'>, <function FileFinder.path_hook.<locals>.path_hook_for_FileFinder at 0x7f0728babdd0>]
msg199323 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2013-10-09 18:28
I believe that this is because once you execute the first line, 'a' exists as a name in the 'lib' namespace, so 'from . import a' sees that 'a' already exists, and does nothing.  The same import sequence in abc.py will put 'a' into the 'abc' namespace, but 'from . import a' will be looking in the 'lib' namespace, won't see an 'a', and will do the new import, overwriting the definition of 'a' in the 'abc' namespace as it does so.

The exact effects of imports inside __init__ is sometimes a bit non-intuitive.
msg199324 - (view) Author: Ethan Glasser-Camp (ethan.glasser.camp) Date: 2013-10-09 18:30
Thanks for the explanation. I had a feeling I was overlooking something obvious but couldn't figure out what it was. Feel free to close as invalid.
History
Date User Action Args
2022-04-11 14:57:51adminsetgithub: 63410
2013-10-09 18:31:01r.david.murraysetstatus: open -> closed
resolution: not a bug
stage: resolved
2013-10-09 18:30:18ethan.glasser.campsetmessages: + msg199324
2013-10-09 18:28:19r.david.murraysetnosy: + r.david.murray
messages: + msg199323
2013-10-09 18:18:04ethan.glasser.campcreate