[2to3] Bug converting import

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Helmut Jarausch

    [2to3] Bug converting import

    Hi

    Given the following two files in the same directory

    Master.py:
    ----------
    #!/usr/bin/python
    import Slave
    Slave.main()

    and
    Slave.py:
    ---------
    def main() :
    print "Hello World"

    Invoking Master.py under python-2.5.2
    works just fine.

    2to3 converts these to

    Master.py:
    ----------
    from . import Slave
    Slave.main()

    I have added the first line
    #!/usr/local/bin/python3.0
    manually

    Slave.py:
    ---------
    def main() :
    print("Hello World")


    Now, when I invoke Master.py I get

    Traceback (most recent call last):
    File "Master.py" , line 2, in <module>
    from . import Slave
    ValueError: Attempted relative import in non-package


    thanks for looking into it,

    Helmut Jarausch

    Lehrstuhl fuer Numerische Mathematik
    RWTH - Aachen University
    D 52056 Aachen, Germany
  • Christian Heimes

    #2
    Re: [2to3] Bug converting import

    Helmut Jarausch wrote:
    Now, when I invoke Master.py I get
    >
    Traceback (most recent call last):
    File "Master.py" , line 2, in <module>
    from . import Slave
    ValueError: Attempted relative import in non-package
    >
    >
    thanks for looking into it,
    The cause of the bug is in fixes/fix_import.py
    probably_a_loca l_import(). The function doesn't check if
    dirname(file_pa th) is a package.

    This patch should fix the bug:

    Index: Lib/lib2to3/fixes/fix_import.py
    =============== =============== =============== =============== =======
    --- Lib/lib2to3/fixes/fix_import.py (Revision 64490)
    +++ Lib/lib2to3/fixes/fix_import.py (Arbeitskopie)
    @@ -53,8 +53,13 @@
    # Must be stripped because the right space is included by the parser
    imp_name = imp_name.split( '.', 1)[0].strip()
    base_path = dirname(file_pa th)
    - base_path = join(base_path, imp_name)
    - for ext in ['.py', pathsep, '.pyc', '.so', '.sl', '.pyd']:
    - if exists(base_pat h + ext):
    + base_name = join(base_path, imp_name)
    + base_init = join(base_path, "__init__")
    + exts = ['.py', pathsep, '.pyc', 'pyo', '.so', '.sl', '.pyd']
    + if not any(exists(base _init + ext) for ext in exts):
    + # not a package
    + return False
    + if any(exists(base _name + ext) for ext in exts):
    return True
    return False

    Comment

    Working...