Relative Package Import

Peter Otten __peter__ at web.de
Thu Jul 10 02:11:11 EDT 2008


Kay Schluehr wrote:

> On 8 Jul., 21:09, Peter Otten <__pete... at web.de> wrote:
>> Robert Hancock wrote:
>> > mypackage/
>> >           __init__.py
>> >           push/
>> >                     __init__.py
>> >                      dest.py
>> >          feed/
>> >                    __init__py
>> >                     subject.py
>>
>> > In subject.py I have
>> >      from ..push import dest
>>
>> > But i receive the error:
>> >   Caught exception importing module subject:
>> >     File "/usr/local/python/lib/python2.5/site-packages/pychecker/
>> > checker.py", line 621, in setupMainCode()
>> >       module = imp.load_module(self.moduleName, file, filename, smt)
>> >     File "subject.py", line 1, in <module>()
>> >       from ..feed import dest
>> >   ValueError: Attempted relative import in non-package
>>
>> > What am I missing?
>>
>> When you run subject as a file
>>
>> pychecker mypackage/feed/subject.py
>>
>> subject.py is regarded as a standalone script, not as part of a package.
>> Try
>>
>> pychecker mypackage.feed.subject
>>
>> instead to invoke the module via the standard import mechanism.
>>
>> Peter
> 
> Since when are Python modules not regarded as standalone scripts but
> as a "part of a package"?
> 
> The only indication that there is some duality and that it is relevant
> at all are those relative imports that came in with Python 2.5. As it
> seems this feature is justified by the artificial semantic differences
> it produces.

I'm probably misunderstanding you, but the ambiguity I wanted to point out
has existed before and has nothing artificial:

$ tree
.
`-- mypackage
    |-- __init__.py
    |-- feed
    |   |-- __init__.py
    |   |-- subject.py
    |   `-- subject.py~
    `-- push
        |-- __init__.py
        `-- dest.py

3 directories, 6 files
$ python2.4 -c "import mypackage.push.dest as d; print d.__name__"
mypackage.push.dest
$ cd mypackage/push/
$ python2.4 -c "import dest as d; print d.__name__"
dest

".." in the import goes one up in the package name, not in the filesystem
and therefore won't work in the second example.

Peter




More information about the Python-list mailing list