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

Search Discussions

  • Ian Kelly at May 7, 2011 at 3:07 pm

    On Sat, May 7, 2011 at 4:02 AM, dmitrey wrote:
    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.
    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 at May 8, 2011 at 6:04 am
    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 at May 8, 2011 at 6:24 am

    On Sat, May 7, 2011 at 11:04 PM, John O'Hagan 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.

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedMay 7, '11 at 10:02a
activeMay 8, '11 at 6:24a
posts4
users4
websitepython.org

People

Translate

site design / logo © 2022 Grokbase