issue on internal import in a package

Frank Millman frank at chagford.com
Sun Feb 27 09:05:24 EST 2011


"人言落日是天涯,望极天涯不见家" <kelvin.you at gmail.com> wrote in message 
news:9529d52b-01b2-402c-a0a0-1e92400380b7 at l14g2000pre.googlegroups.com...
> On Feb 27, 9:38 pm, "Frank Millman" <fr... at chagford.com> wrote:
>> "人言落日是天涯,望极天涯不见家" <kelvin.... at gmail.com> wrote in message
>>
>> news:fa94323b-d859-4599-b236-c78a22b3d4dd at t19g2000prd.googlegroups.com...
>>
>> > On Feb 27, 9:22 pm, "Frank Millman" <fr... at chagford.com> wrote:
>>
>> > This behavior is by design or just a bug for Python3.x ?
>>
>> Definitely by design.
>>
>> Have a look at PEP 328 -http://www.python.org/dev/peps/pep-0328/
>>
>> "In Python 2.4 and earlier, if you're reading a module located inside a
>> package, it is not clear whether
>> import foo
>> refers to a top-level module or to another module inside the package. As
>> Python's library expands, more and more existing package internal modules
>> suddenly shadow standard library modules by accident. It's a particularly
>> difficult problem inside packages because there's no way to specify which
>> module is meant. To resolve the ambiguity, it is proposed that foo will
>> always be a module or package reachable from sys.path. This is called an
>> absolute import."
>>
>> HTH
>>
>> Frank
>
> Yes, it's okay with the change in a.py with below line:
> from . import b
>
> But another issue occurred if I want to run the a.py separately.
> $ cd module
> $ python a.py
> Traceback (most recent call last):
>  File "a.py", line 1, in <module>
>    from . import b
> ValueError: Attempted relative import in non-package
>
> Does that mean the relative import only allowed in the package.
> And it cannot be run as __main__ program unless I change the relative
> import back to absolute import?
> I think this behavior is strange and difficult to use.
>

I think that PEP 366 addresses your question -

    http://www.python.org/dev/peps/pep-0366/

I came across this while investigating a separate problem. It looks a bit 
complicated, and I don't have such a requirement, so I did not look at it 
too closely.

Have a read and see if it solves your problem. If not post a follow-up 
message here and see if someone else can offer more information.

Frank





More information about the Python-list mailing list