Relative imports in Python 3.0

Discussion in 'Python' started by Nicholas, Dec 17, 2008.

  1. Nicholas

    Nicholas Guest

    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
    Nicholas, Dec 17, 2008
    #1
    1. Advertising

  2. wrote:
    > 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
    > --
    > http://mail.python.org/mailman/listinfo/python-list
    >

    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
    Brian Allen Vanderburg II, Dec 17, 2008
    #2
    1. Advertising

  3. Nicholas

    Benjamin Guest

    On Dec 17, 4:01 am, Nicholas <> wrote:
    > 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

    >
    > Best wishes,
    >
    > Nicholas
    Benjamin, Dec 17, 2008
    #3
  4. Nicholas

    Kay Schluehr Guest

    On 17 Dez., 11:01, Nicholas <> wrote:

    > 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/ .
    Kay Schluehr, Dec 18, 2008
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Randall Smith

    Writing apps without using relative imports

    Randall Smith, Dec 3, 2004, in forum: Python
    Replies:
    0
    Views:
    295
    Randall Smith
    Dec 3, 2004
  2. Albert
    Replies:
    4
    Views:
    10,871
    Albert
    Jul 10, 2008
  3. zildjohn01
    Replies:
    0
    Views:
    647
    zildjohn01
    Feb 22, 2011
  4. Victor Hooi
    Replies:
    1
    Views:
    106
    Devin Jeanpierre
    Nov 25, 2013
  5. Replies:
    0
    Views:
    77
Loading...

Share This Page