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?
Related problems
- Relative imports in Python 3
- How to get the parent dir location
- Sibling package imports
- Relative imports for the billionth time
- How to fix "Attempted relative import in non-package" even with __init__.py
- How can I do relative imports in Python?
- How to fix "Attempted relative import in non-package" even with __init__.py