Issue 7902: relative import broken (original) (raw)

Created on 2010-02-10 19:09 by gangesmaster, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
bar.py gangesmaster,2010-02-10 19:09
issue-7902.patch meador.inge,2010-02-24 05:27 patch against 2.7 trunk
Messages (11)
msg99176 - (view) Author: ganges master (gangesmaster) Date: 2010-02-10 19:09
the relative-import mechanism is broken... at least on python2.6 but i'd guess on later versions as well. consider this package layout: /tmp/foo/ /tmp/foo/__init__.py /tmp/foo/bar.py where bar.py is: # note this is a relative import and should fail! from .os import walk print walk # and this should also fail from . import os print os running it yields a bug: $ PYTHONPATH="/tmp" python Python 2.6.4 (r264:75706, Dec 7 2009, 18:45:15) [GCC 4.4.1] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import foo.bar <function walk at 0xb7d2aa04> # <<<< ?!?! Traceback (most recent call last): File "", line 1, in File "/tmp/foo/bar.py", line 4, in from . import os ImportError: cannot import name os "from . import os" fails as expected, but "from .os import walk" works -- although it should obviously fail too. -tomer
msg99177 - (view) Author: ganges master (gangesmaster) Date: 2010-02-10 19:10
i believe brett is in charge of this, adding him to the noisy. sorry if it's not you :)
msg99179 - (view) Author: Brett Cannon (brett.cannon) * (Python committer) Date: 2010-02-10 21:11
So doing the import manually through __import__('os', globals(), locals(), ['walk'], 1) does not work. My guess is it has something to do with the IMPORT_FROM opcode (or something related), but I don't have time right now to dig deeper.
msg100006 - (view) Author: Meador Inge (meador.inge) * (Python committer) Date: 2010-02-24 05:27
> So doing the import manually through __import__('os', globals(), > locals(), ['walk'], 1) does not work. I get the same behavior for this reproduction case regardless of whether I use: import .os import walk or: __import__('os', globals(), locals(), ['walk'], 1) The bug is reproducible in the trunk. I think the problem has to do with 'import_module_level' incorrectly doing an absolute lookup for 'os' when the relative lookup in 'foo' fails. I have attached a patch with the relevant fix and test case.
msg106065 - (view) Author: Meador Inge (meador.inge) * (Python committer) Date: 2010-05-19 13:26
Does this patch seem reasonable?
msg106179 - (view) Author: Brett Cannon (brett.cannon) * (Python committer) Date: 2010-05-20 18:41
Thanks for the patch, Meador. All I did was tweak the test slightly. Committed in: + 2.7: r81380 + 2.6: r81381
msg113926 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2010-08-14 19:41
Backporting this change to 2.6 has created an incompatibility in that branch, see for example . Apparently, it will only break code that is "conceptually wrong", but still "worked" on 2.6. I'll suggest that this is a release-critical issue for 2.6.6. It should be considered whether the incompatibility is accepted, or fixed, or reverted.
msg114048 - (view) Author: Florent Xicluna (flox) * (Python committer) Date: 2010-08-16 15:17
Btw, the comment and failure message in r81380/r81381 look wrong. - # If absolute import syntax is used, then do not try to perform - # a relative import in the face of failure. + # If explicit relative import syntax is used, then do not try + # to perform an absolute import in the face of failure. self.fail("explicit relative import triggered " - "an implicit relative import") + "an implicit absolute import") In addition the TestCase.assertRaises method could be used: def test_absolute_import_without_future(self): # If explicit relative import syntax is used, then do not try # to perform a relative import in the face of failure. # Issue #7902. with self.assertRaises(ImportError): from .os import sep self.fail("explicit relative import triggered an " "implicit absolute import")
msg114065 - (view) Author: Florent Xicluna (flox) * (Python committer) Date: 2010-08-16 18:58
Comment changed in r84097, 3.2 branch, with minor fixes.
msg114067 - (view) Author: Barry A. Warsaw (barry) * (Python committer) Date: 2010-08-16 19:11
Guido has spoken: http://mail.python.org/pipermail/python-dev/2010-August/103104.html We'll keep the change for 2.6.6rc2.
msg114082 - (view) Author: Florent Xicluna (flox) * (Python committer) Date: 2010-08-16 22:44
Merged in 3.1 with r84115.
History
Date User Action Args
2022-04-11 14:56:57 admin set github: 52150
2011-01-17 17:01:49 r.david.murray link issue10926 superseder
2010-08-16 22:44:22 flox set messages: +
2010-08-16 19:11:12 barry set status: open -> closednosy: + barrymessages: +
2010-08-16 18:58:33 flox set messages: +
2010-08-16 15:17:55 flox set nosy: + floxmessages: +
2010-08-14 19:41:30 loewis set status: closed -> openpriority: normal -> release blocker
2010-08-14 19:41:04 loewis set nosy: + loewismessages: +
2010-05-20 18:41:46 brett.cannon set status: open -> closedresolution: fixedmessages: + stage: patch review -> resolved
2010-05-19 20:10:51 brett.cannon set keywords: + needs reviewassignee: brett.cannonstage: patch review
2010-05-19 13:26:03 meador.inge set messages: +
2010-02-24 05:27:37 meador.inge set files: + issue-7902.patchnosy: + meador.ingemessages: + keywords: + patch
2010-02-12 08:41:33 Oren_Held set nosy: + Oren_Held
2010-02-10 21:11:35 brett.cannon set messages: +
2010-02-10 19:10:55 gangesmaster set nosy: + brett.cannonmessages: +
2010-02-10 19:09:21 gangesmaster create