Relative imports in Python 3.0

N

Nicholas

Imagine a module that looks like

ModuleDir
__init__.py
a.py
b.py


In python 2.x I used to have tests at the end of each of my modules,
so that module b.py might look something like

import a
..........
..........

if __name__ == '__main__':
runtests()

But under Python 3.0 this seems impossible. For usual use import a.py
has to become the line:

from . import a

But if I use that form it is no longer possible to run b.py as a
standalone script without raising an error about using relative
imports.

I am sure I am not the first to run into this issue, but what is the
solution?

Best wishes,

Nicholas
 
B

Brian Allen Vanderburg II

Imagine a module that looks like

ModuleDir
__init__.py
a.py
b.py


In python 2.x I used to have tests at the end of each of my modules,
so that module b.py might look something like

import a
..........
..........

if __name__ == '__main__':
runtests()

But under Python 3.0 this seems impossible. For usual use import a.py
has to become the line:

from . import a

But if I use that form it is no longer possible to run b.py as a
standalone script without raising an error about using relative
imports.

I am sure I am not the first to run into this issue, but what is the
solution?

Best wishes,

Nicholas
Sorry for the duplicate, sent to wrong email.

Python 3 (and I think 2.6) now use absolute import when using a 'import
blah' statement.

if ('.' in __name__) or hasattr(globals, '__path__'):
from . import a
else:
import a

If '__name__' has a'.' then it is either a package or a module in a
package, in which case relative imports can be used. If it does not
have a '.' it may still be a package but the '__init__.py' file, in
which case the module has a '__path__' attribute, so relative imports
can be used. Otherwise it is not a package or in a package so absolute
imports must used. Also, since it is not in a package it is assumed
that it is top module (__main__) or possible module imported from the
top that is not in a package, such as a.py doing an 'import b', b would
be a module but not a package so still probably need absolute imports,
my guess anyway.

But I also think that 'from . import a' would be nice if it would work
from non-packages as well, meaning just 'import a' if it is a non-package.

Brian A. Vanderburg II
 
B

Benjamin

Imagine a module that looks like

ModuleDir
     __init__.py
     a.py
     b.py

In python 2.x I used to have tests at the end of each of my modules,
so that module b.py might look something like

import a
 ..........
 ..........

if __name__ == '__main__':
   runtests()

But under Python 3.0 this seems impossible.  For usual use import a.py
has to become the line:

from . import a

But if I use that form it is no longer possible to run b.py as a
standalone script without raising an error about using relative
imports.

I am sure I am not the first to run into this issue, but what is the
solution?

Use absolute imports:

from ModuleDir import a
 
K

Kay Schluehr

I am sure I am not the first to run into this issue, but what is the
solution?

When you use 2to3 just uncomment or delete the file fix_import.py in
lib2to3/fixes/ .
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,058
Latest member
QQXCharlot

Latest Threads

Top