I have two python modules, a.py and b.py, both of which are in lib/ relative to the current directory. Suppose each module needs the functionality of the other.
a.py:
import lib.b
...
b.py:
import lib.a
...
The above example works with
PYTHONPATH=./lib python -c 'from lib import a, b'
However, if I switch the imports in a.py and b.py to from lib import b and from lib import a, respectively, the above Python command terminates with ImportError.
Could someone please explain why this breaks? I'm not trying to import any member from either a or b. (In that case I would be importing from an uninitialized module, as the question referenced below points out.)
Reference:
解决方案
Since there did not seem to be a direct way to address the circular import, I went with a workaround.
In my actual use case, module a imported module b only to call the function b.fn, so I decided to put fn in a third module c and import c instead:
c.py
def fn():
...
b.py
from lib import a
from lib import c
...
# Explicitly assign `fn` into this module.
fn = c.fn
(The above could also be done with from lib.c import fn, but I prefer the explicit version.)
a.py
from lib import c
...
That way, the circular import between a and b is gone, and any additional modules that import b can use b.fn directly.