I have gone through many Python relative import questions but I can’t understand the issue/get it to work.
My directory structure is:
Driver.py
A/
Account.py
__init__.py
B/
Test.py
__init__.py
Driver.py
from B import Test
Account.py
class Account:
def __init__(self):
self.money = 0
Test.py
from ..A import Account
When I try to run:
python Driver.py
I get the error
Traceback (most recent call last): from B import Test File "B/Test.py", line 1, in <module> from ..A import Account ValueError: Attempted relative import beyond toplevel package
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
This is happening because A and B are independent, unrelated, packages as far as Python is concerned.
Create a __init__.py in the same directory as Driver.py and everything should work as expected.
Method 2
In my case adding __init__.py was not enough. You also have to append the path of the parent directory if you get module not found error.
root : | |__SiblingA: | __A.py | |__SiblingB: | _ __init__.py | __B.py |
To import B.py from A.py, you have to do the following
import sys
# append the path of the parent directory
sys.path.append("..")
from SiblingB import B
print("B is successfully imported!")
Method 3
The reason for
ValueError: Attempted relative import beyond toplevel package
is that A is the same directory level as Driver.py. Hence, ..A in from ..A import Account is beyond top-level package.
You can solve this by create a new folder named AandB together with __init__py in this new folder, and then move A and B folders into AandB folder. The directory structure is as following:
Correspondingly, the content in Driver.py should be modified as from AandB.B import Test.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0
