[2to3] Bug converting import

H

Helmut Jarausch

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
 
C

Christian Heimes

Helmut said:
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_local_import(). The function doesn't check if
dirname(file_path) 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_path)
- base_path = join(base_path, imp_name)
- for ext in ['.py', pathsep, '.pyc', '.so', '.sl', '.pyd']:
- if exists(base_path + 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
 

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

Forum statistics

Threads
473,968
Messages
2,570,149
Members
46,695
Latest member
StanleyDri

Latest Threads

Top