Skip to main content

Free your python code from 12-factor boilerplate.

Project description

petri: free your python code from 12-factor boilerplate.

Python Version Python Version
Code Style Code Style
Release PyPI
Downloads PyPI - Downloads
Build Status Build Status
Docs Documentation Status
Maintainability Maintainability
License License: Unlicense
Coverage Test Coverage
Deps dependency status for GitHub repo


Importing petri equips your app/pacakage with:

  • Dotenv file handling using python-dotenv.
  • Package metadata (for installed packages), using importlib-metadata.
  • Settings using pydantic.
  • Logging config using structlog.
  • Environment switching (prod/dev/test) handling via ENV environment variable.
Sample petri usage


  • In order to have same code for dev/production, it all starts with an innocent
  • In order to switch between them, it’s a good idea to use env vars…
  • But sometimes, you want to overrride a single variable.
  • But sometimes, you want to overrride several variables.
  • Plus, colored logs while developing are pretty.
  • Plus, structured logs in production look smart.


  • [X] Sane defaults for logging:
    • [X] json logs for production.
    • [X] user-friendly (spaced) + colored for development.
    • [X] Enforce root logger’s formatting.
  • [X] Easy settings:
    • [X] Toggle between configurations using a signle env var.
    • [X] Define default configuration in case the env var is not present.
    • [X] Granular settings override using environment variables.
    • [X] Batch settings override by loading a .env.
  • Read package metadata (author, version, etc):
    • [X] Lazy-loaded to avoid reading files during imports.
    • [X] For installed packages only.


Install using poetry poetry add petri or pip pip install petri or (for dev) pip install git+

Optionally, also install the color extra for colored logs using colorama.


Just define configuration setting(s) and instantiate petri.Petri:

#  my_package/

from petri import Petri
from petri.settings import BaseSettings
from petri.loggin import LogFormatter, LogLevel

class Settings(BaseSettings):
    SQL_CONNECTION_STRING = 'sqlite:///database.db'  # example setting

class Production(Settings):
    LOG_FORMAT = LogFormatter.JSON
    LOG_LEVEL = LogLevel.TRACE

class Development(Settings):
    LOG_FORMAT = LogFormatter.COLOR  # requires colorama

pkg = Petri(__file__)

# demo logs"log away info level",mode=pkg.settings, version=pkg.meta.version)
pkg.log.warning("this will show", kewl=True)

That’s it!. Watch the animation above for results running python -c “import my_package”

Optionally, define an environment variable named env_file, to override the settings:

  • Its value must be the path to a valid, existing file.
  • Its contents must have name=value pairs.
  • The names must be of the form [MY_PACKAGE]_[SETTING_NAME] (Watch the animation above).

To select which of your settings classes to use, you can:

  • Point the selector envvar (eg: for my-pkg, this would be MY_PKG_CONFIG=my_pkg.settings:Production), or
  • Use the default_config kwarg when instantiating petri.Petri (eg: use pkg = Petri(__file__, default_config=”my_pkg.settings:Production”) in the example above).

Of course, you can use both. Petri will attempt to load the selecto envvar, and if not found, default to the defined kwarg.

For more info, check the docs.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for petri, version 0.24.1
Filename, size File type Python version Upload date Hashes
Filename, size petri-0.24.1-py3-none-any.whl (10.6 kB) File type Wheel Python version py3 Upload date Hashes View
Filename, size petri-0.24.1.tar.gz (11.9 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page