Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is absolute import failing with Python 2, but succeeding with Python3?

While fiddling with Python import system, I noticed this form of absolute import works well with Python 3.6.8, but throws ImportError with Python 2.7.17. The package structure is as follows:

├── main8.py
├── pkg_a
│   ├── __init__.py
│   ├── mod7.py
│   ├── pkg_c
│   │   ├── __init__.py
│   │   ├── mod2.py

main8.py

import pkg_a.mod7

pkg_a/mod7.py

import pkg_a.pkg_c.mod2

pkg_a/pkg_c/mod2.py

print('Imported pkg_a.pkg_c.mod2')

If I execute main8.py with Python3, pkg_a.pkg_c.mod2 gets imported successfully.

$ python3 main8.py 
Imported pkg_a.pkg_c.mod2

However, If I execute main8.py with Python2, it throws an ImportError.

$ python2 main8.py 
Traceback (most recent call last):
  File "main8.py", line 1, in <module>
    import pkg_a.mod7
  File "pkg_a/mod7.py", line 1, in <module>
    import pkg_a.pkg_c.mod2
ImportError: No module named pkg_c.mod2

Adding from __future__ import absolute_import directive at the top of main8.py and pkg_a/mod7.py didn't help. Can anyone please explain why Python2 import is behaving like this?

like image 702
Holmes.Sherlock Avatar asked May 12 '26 20:05

Holmes.Sherlock


1 Answers

For Python2 you need to have a __init__.py next to main8.py to make a package:

.
├── __init__.py
├── main8.py
└── pkg_a
    ├── __init__.py
    ├── __init__.pyc
    ├── mod7.py
    ├── mod7.pyc
    └── pkg_c
        ├── __init__.py
        ├── __init__.pyc
        ├── mod2.py
        └── mod2.pyc

2 directories, 10 files

Running:

>> /usr/bin/python2.7 ./main8.py
Imported pkg_a.pkg_c.mod2

>> python3 ./main8.py
Imported pkg_a.pkg_c.mod2
like image 188
Maurice Meyer Avatar answered May 14 '26 09:05

Maurice Meyer



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!