beyond top level package error in relative import

import, package, python

Solution

EDIT: There are better/more coherent answers to this question in other questions:

- Sibling package imports

- Relative imports for the billionth time

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` (i.e. `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 `$PATH` and `$PYTHONPATH`.

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.

Problem

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?

Original source

Related problems