It seems there are already quite some questions here about relative import in python 3, but after going through many of them I still didn't find the answer for my issue. so here is the question.
I have a package shown below
package/ __init__.py A/ __init__.py foo.py test_A/ __init__.py test.py
and I have a single line in test.py:
from ..A import foo
now, I am in the folder of
package, and I run
python -m test_A.test
I got message
"ValueError: attempted relative import beyond top-level package"
but if I am in the parent folder of
package, e.g., I run:
cd .. python -m package.test_A.test
everything is fine.
Now my question is:
when I am in the folder of
package, and I run the module inside the test_A sub-package as
test_A.test, based on my understanding,
..A goes up only one level, which is still within the
package folder, why it gives message saying
beyond top-level package. What is exactly the reason that causes this error message?
This question is tagged with
~ Asked on 2015-06-05 14:46:31
EDIT: There are better/more coherent answers to this question in other questions:
Why doesn't it work? It's because python doesn't record where a package was loaded from. So when you do
python -m test_A.test, it basically just discards the knowledge that
test_A.test is actually stored in
package is not considered a package). Attempting
from ..A import foo is trying to access information it doesn't have any more (i.e. sibling directories of a loaded location). It's conceptually similar to allowing
from ..os import path in a file in
math. This would be bad because you want the packages to be distinct. If they need to use something from another package, then they should refer to them globally with
from os import path and let python work out where that is with
When you use
python -m package.test_A.test, then using
from ..A import foo resolves just fine because it kept track of what's in
package and you're just accessing a child directory of a loaded location.
Why doesn't python consider the current working directory to be a package? NO CLUE, but gosh it would be useful.
~ Answered on 2017-10-31 08:19:37
import sys sys.path.append("..") # Adds higher directory to python modules path.
Try this. Worked for me.
~ Answered on 2017-08-25 05:25:42