Pydantic BaseSettings cant find .env when running commands from different places – Pydantic

by
Ali Hasan
alembic fastapi llama-cpp-python pydantic

Quick Fix: Ensure .env file is in the same directory as the running script or manually anchor it to an absolute path within the settings.py file using os.path.join(os.path.dirname(__file__), ".env").

The Solutions:

Solution 1: Manually anchor .env file to an absolute path

To resolve the issue where BaseSettings cannot find the .env file when running commands from different places, anchor the .env file to an absolute path. Here’s how:

In the settings module where BaseSettings is defined:

import os
...

# Define the absolute path to .env file
DOTENV = os.path.join(os.path.dirname(__file__), ".env")

# Use the absolute path in BaseSettings configuration
class Settings(BaseSettings):
    ...
    model_config = SettingsConfigDict(env_file=DOTENV)  

This ensures that BaseSettings always looks for the .env file in the same directory as the settings module, regardless of where the commands are run from.

Solution 2: {title}

To resolve the issue where Pydantic’s BaseSettings is unable to locate the `.env` file when commands are executed from different locations, you can use the following approach:

  • First, install `python-dotenv` by running `pip install python-dotenv`. This library makes it easier to work with environment variables.
  • Next, in your `config.py` file, import `find_dotenv` and `load_dotenv` from `python-dotenv` and `SettingsConfigDict` from `pydantic_settings`. Here’s the revised code for your config.py:

“`
from pydantic_settings import BaseSettings, SettingsConfigDict
from dotenv import find_dotenv, load_dotenv

load_dotenv(find_dotenv(".env"))

class Config(BaseSettings):

model_config = SettingsConfigDict(case_sensitive=True)

<ul>
<li>The `load_dotenv` function loads environment variables from the `.env` file located in the same directory or any parent directory.</li>
<li>The `find_dotenv` function automatically searches for the `.env` file in the current directory and all parent directories, ensuring that the environment variables are accessible regardless of the execution location.</li>
<li>By using this approach, you can load environment variables dynamically, eliminating the need to specify specific paths or rely on relative paths, which can cause issues when running commands from different locations.</li>
</ul>

Q&A

What should I do?

Manually anchor the .env file to an absolute path.

What is the full path to .env in this example?

The full path to .env in this example is /my-app/project/core/.env.

What is the solution with pydantic 2.4.2?

Combine python-dotenv‘s load_env and find_dotenv and set up BaseSettings as shown in the example.

Video Explanation:

The following video, titled "Configuring a FastAPI Python Project - The First Steps of URL ...", provides additional insights and in-depth exploration related to the topics discussed in this post.

Play video

This is the beginning of a full step-by-step course on building a URL Shortener with FastAPI and Python. The video includes setting up the ...