Cycles between package imports

Martin Blais blais at furius.ca
Sat Jun 17 23:43:14 CEST 2006


Hi

I'm a tad confused over a problem involving cycles between
packages.

Assume the following sets of files::

  driver.py
  a/__init__.py
  a/alice.py
  b/__init__.py
  b/bob.py

Basically, two packages a and b.  Driver simply imports one of the
two.  This is the file that gets run::

,---- (driver.py)
|
| import a.alice
|
`----

The package initialization files (__init__.py) both contain
nothing.  a.alice imports b.bob, and b.bob imports a.alice.

The following works fine:

,---- (a/alice.py)
|
| import b.bob
|
`----

,---- (b/bob.py)
|
| import a.alice
|
`----


However, if I change b/bob.py to import using "from" syntax, i.e.:

,---- (b/bob.py)
|
| from a import alice
|
`----

It does not work anymore::

  Traceback (most recent call last):
    File "driver.py", line 3, in ?
      import a.alice
    File "/tmp/experiments/import-cycle/a/alice.py", line 9, in ?
      import b.bob
    File "/tmp/experiments/import-cycle/b/bob.py", line 9, in ?
      from a import alice
  ImportError: cannot import name alice


So cycles between packages do not behave as cycles between
modules--there is a subtlety.

At the time that b/bob.py attempts to import a.alice, a.alice is
still being imported (i.e. executed), and there is a difference
between

  import a.alice

and

  from a import alice


I don't see why the reference to module a.alice could not be
available via the "from" syntax, even if it is still incompletely
initialized at the time of import.

Can anyone shed some light onto this?  Is there a rule for
determining when a module becomes available to import from a
package using the "from" syntax?



More information about the Python-list mailing list