Python3: imports don't see files from same directory?

Benjamin Kaplan benjamin.kaplan at case.edu
Sun May 8 02:24:03 EDT 2011


On Sat, May 7, 2011 at 11:04 PM, John O'Hagan <research at johnohagan.com> wrote:
> On Sat, 7 May 2011, Ian Kelly wrote:
> [...]
>>
>> Implicit relative imports were removed in Python 3 to prevent
>> ambiguity as the number of packages grows.  See PEP 328.
>>
>> If you have two modules in the same package, pack1.mod1 and
>> pack1.mod2, then in pack1.mod1 you can no longer just do "import
> mod2"
>> or "from mod2 import foo".  Either use an absolute import ("from
>> pack1.mod2 import foo") or make the relative import explicit ("from
>> .mod2 import foo" -- note the ".")
>>
>> If you're upgrading scripts from Python 2 to Python 3, you should
>> really run them through the 2to3 tool.  I believe this is one of the
>> many things it will fix for you automatically.
>
> For some reason I haven't fathomed yet, I've found that while 2to3
> does change the import syntax to the dot form as you say, this results
> in "ValueError: Attempted relative import in non-package", and I have
> to change it back to the old way, which works fine although the docs
> say it shouldn't. This is python 3.2 on Debian testing.
>
> For example, if I have a directory containing an __init__.py file, and two
> modules, one of which is called mod1 and contains
>
> #!/usr/bin/python3
> a=1
>
> in the other module I can have
>
> import mod1
>
> or
>
> from  mod1 import a
>
> but not
>
> from .mod1 import a
>
> or
>
> import .mod1
>
>
> What gives?

* Absolute imports are given as modules coming straight from something
on sys.path. If you actually check sys.path, you'll probably notice
that '' is on there, which in this case refers to the current
directory.

* In order to do relative imports, you need to be in a package. Having
an __init__.py somewhere does not automatically make it a package. To
be a package, it has to be in one of the folders on sys.path. Since
python doesn't have a name for that folder that __init__.py is in,
it's not actually a part of a package.



More information about the Python-list mailing list