issue on internal import in a package

Frank Millman frank at chagford.com
Sun Feb 27 14:22:29 CET 2011


"Ben Finney" <ben+python at benfinney.id.au> wrote in message 
news:87ei6t646h.fsf at benfinney.id.au...
> 人言落日是天涯,望极天涯不见家 <kelvin.you at gmail.com> writes:
>
>> Here is a simple example:
>> [app]
>>       [module]
>>             __init__.py   --> empty
>>             a.py   --> import b
>>             b.py  --> defined a function foo()
>>       test.py
>>
>> In the test.py, contains the below statement:
>> from module import a
>> Execute the test.py will get error:
>
> This works fine for me::
>
>    $ mkdir --parents app/module/
>    $ touch app/module/__init__.py
>    $ printf "import b\n" > app/module/a.py
>    $ printf "def foo(): pass\n" > app/module/b.py
>    $ printf "from module import a\n" > app/test.py
>    $ find .
>    .
>    ./app
>    ./app/module
>    ./app/module/__init__.py
>    ./app/module/a.py
>    ./app/module/b.py
>    ./app/test.py
>
>    $ python app/test.py
>
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>>   File "module\a.py", line 1, in <module>
>>     import b
>> ImportError: No module named b
>>
>> Why the b.py can not be found by a.py?
>
> I get no errors; the code appears to run fine. Perhaps the scenario is
> not exactly as you describe?
>

I get exactly the same result as the OP, using python 3.2 on both windows 
and linux. It works using python 2.6.

I can fix it by changing a.py from 'import b' to 'from . import b'.

As I understand it, the reason is that python 3.x will no longer look for an 
absolute import in the current package - it will only look in sys.path.

Frank Millman





More information about the Python-list mailing list