Python relative imports in AWS Lambda fail with `attempted relative import with no known parent package` # The Problem In AWS Lambda if I attempt an explicit relative import like this ``` . ├── lambda_file.py └── example.py ``` ``` # lambda_file.py from .example import lambda_handler ``` ``` # example.py def lambda_handler(event, context): return True ``` And I configure AWS Lambda's handler to `lambda_file.lambda_handler` I get the following errors * Python 2.7 : `Attempted relative import in non-package` * Python 3.7 : `attempted relative import with no known parent package` # Why use explicit relative imports [PEP008](https://www.python.org/dev/peps/pep-0008/#id23) says : > Implicit relative imports should never be used and have been removed in Python 3. # How to workaround by using implicit relative imports If I change `lambda_file.py` to contain the following, it works, but no longer uses explicit relative imports ``` # lambda_file.py from example import lambda_handler ``` # How to correctly solve the problem The solution is to ensure that the "Handler" value that you configure in AWS Lambda contain at least 2 `.` periods. To achieve this you need to put your code within a directory in your AWS Lambda code zip file and make that directory a module by adding an empty `__init__.py` file. The resulting structure looks like this ``` . ├── app │   ├── __init__.py │   ├── lambda_file.py │   └── example.py ``` And you now change the "Handler" value from `lambda_file.lambda_handler` to `app.lambda_file.lambda_handler` # Additional Notes * AWS Lambda [loads your handler as a module import](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html) not as a top-level script * This solution came after reading [this explanation of explicit relative imports](https://stackoverflow.com/a/14132912/168874) by [Brendan Barnwell](https://stackoverflow.com/users/1427416/brenbarn)