How to fix "Attempted relative import in non-package" even with init.py
Address the "Attempted relative import in non-package" error by initiating your script within a package. Validate that a __init__.py
file is within the directory to denote the package. Employ dot notation to utilize relative imports and make sure your script's directory is in line with the package's structure.
For instance, given this structure:
package/
├── __init__.py
├── module_a.py
└── module_b.py
Use this syntax in module_b
to import from module_a
:
Execute the script with the -m
flag from the parent directory of package
:
python -m package.module_b
Utilizing the package attribute and the -m
flag
Python uses the package attribute to understand the package's hierarchy when executing scripts. Should your script's relative imports fail, Python might not acknowledge it as part of a package.
The -m (module) flag helps you operate a module as a script, retaining the package context:
python -m pkg.tests.core_test
Ensure you're in the directory above your package when using the -m flag. Python sets the package attribute accordingly, enabling your relative imports to function properly.
Correcting sys.path for import resolution
To help Python locate your modules, you might need to modify sys.path. Adding the necessary paths can resolve issues connected with Python failing to find the related files:
Manipulating sys.path
can serve as a workaround, but it's generally better to correctly structure your project and use the -m
flag or execute your script from the correct directory level.
Troubleshooting common problems with relative imports
The if name == 'main': block is necessary for scripts to be both importable and executable. Next, check if package is None within this block and set it accordingly before performing relative imports:
Setting package is crucial, especially when your script is the main module, but you want to perform relative imports as if it were in a package.
Resolving non-package scripts
For scripts outside the package hierarchy, consider absolute imports, or update sys.path dynamically using os.path methods to direct Python to the correct directory:
This method is common in test modules, allowing you to import from various parts of your application without restructuring everything for testing purposes.
Seeking further help
Before reaching out, use reliable resources for solutions. The Real Python guide and PEP 328 (in the references below) are excellent starting points. If problems persist, validate your script's execution context and verify your package structure, both critical aspects for the efficient operation of relative imports.
Was this article helpful?