Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

127 views
Skip to first unread message

dmitrey

unread,
May 7, 2011, 6:02:29 AM5/7/11
to
hi all,
I try to port my code to Python 3 and somehow files don't see files
from same directory, so I have to add those directories explicitly,
e.g.
import sys
sys.path += [...]

Also, it leads to bugs like this one:
http://groups.google.com/group/comp.lang.python/browse_thread/thread/961a90219a61e19d#

any ideas what's the reason and how to fix it?
I have tried to search google but got nothing yet.

Thank you in advance, D.

Ian Kelly

unread,
May 7, 2011, 11:07:37 AM5/7/11
to Python

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.

John O'Hagan

unread,
May 8, 2011, 2:04:30 AM5/8/11
to pytho...@python.org
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?

Benjamin Kaplan

unread,
May 8, 2011, 2:24:03 AM5/8/11
to pytho...@python.org

* 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.

0 new messages