Python imports drive me crazy (my experience with python imports sometime doesn't correspond at all to idiom 'Explicit is better than implicit' :( ):
[app] start.py from package1 import module1 [package1] __init__.py print('Init package1') module1.py print('Init package1.module1') from . import module2 module2.py print('Init package1.module2') import sys, pprint pprint.pprint(sys.modules) from . import module1 I get:
vic@ubuntu:~/Desktop/app2$ python3 start.py Init package1 Init package1.module1 Init package1.module2 {'__main__': <module '__main__' from 'start.py'>, ... 'package1': <module 'package1' from '/home/vic/Desktop/app2/package1/__init__.py'>, 'package1.module1': <module 'package1.module1' from '/home/vic/Desktop/app2/package1/module1.py'>, 'package1.module2': <module 'package1.module2' from '/home/vic/Desktop/app2/package1/module2.py'>, ... Traceback (most recent call last): File "start.py", line 3, in <module> from package1 import module1 File "/home/vic/Desktop/app2/package1/module1.py", line 3, in <module> from . import module2 File "/home/vic/Desktop/app2/package1/module2.py", line 5, in <module> from . import module1 ImportError: cannot import name module1 vic@ubuntu:~/Desktop/app2$ import package1.module1 works, but i want to use from . import module1 because i want to make package1 portable for my other applications, that's why i want to use relative paths.
I am using python 3.
I need circular imports. A function in module1 asserts that one of its parameter is instance of a class defined in module2 and viceversa.
In other words:
sys.modules contains 'package1.module1': <module 'package1.module1' from '/home/vic/Desktop/app2/package1/module1.py'>. I want to get a reference to it in form from . import module1, but it tries to get a name, not a package like in case import package1.module1 (which works fine). I tried import .module1 as m1 - but that's a syntax error.
Also, from . import module2 in module1 works fine, but from . import module1 in module2 doesn't work...
UPDATE:
This hack works (but i am looking for the 'official' way):
print('Init package1.module2') import sys, pprint pprint.pprint(sys.modules) #from . import module1 parent_module_name = __name__.rpartition('.')[0] module1 = sys.modules[parent_module_name + '.module1']
from .[optional] import name.import Xactually can be relative too, unless you importabsolute_importsfrom__future__.