import argparse import os from typing import Sequence from dotenv import load_dotenv """ This is always the entry point so you don't technically need to do the __name__ == "__main__" check, but its still common practice to show that this is the entry point. You would start your project/app by first installing it. You can install it as an editable package during development as this symlinks it instead. Example (in venv): pip install -e . python -m ajusta_bling args... """ class EnvDefault(argparse.Action): def __init__(self, envvar, required=False, default=None, **kwargs): if not default and envvar: if envvar in os.environ: default = os.environ[envvar] if required and default: required = False super(EnvDefault, self).__init__(default=default, required=required, **kwargs) def __call__(self, parser, namespace, values, option_string=None): setattr(namespace, self.dest, values) def main(argv: Sequence[str] | None = None) -> int: """ This is where I would put argparse (if you want to use this as a callable package with args) If not then I use this as setup. """ parser = argparse.ArgumentParser( prog=__package__ or "ajusta_bling", ) parser.add_argument( "--dbuser", "-du", type=str, action=EnvDefault, required=True, envvar="DB_USER", help="PostgreSQL User", ) parser.add_argument( "--dbpassword", "-dP", type=str, action=EnvDefault, envvar="DB_PASS", help="PostgreSQL Password", ) parser.add_argument( "--dbhost", "-dh", type=str, action=EnvDefault, required=True, envvar="DB_HOST", help="PostgreSQL Host", ) parser.add_argument( "--dbport", "-dp", type=int, action=EnvDefault, required=True, envvar="DB_PORT", help="PostgreSQL Port", ) parser.add_argument( "--dbname", "-db", type=str, action=EnvDefault, required=True, envvar="DB_NAME", help="PostgreSQL Database", ) parser.add_argument( "--webhost", "-wh", type=str, action=EnvDefault, required=True, envvar="WEB_HOST", help="Web server host", ) parser.add_argument( "--webport", "-wp", type=int, action=EnvDefault, required=True, envvar="WEB_PORT", help="Web server port", ) parser.add_argument( "--debug", type=bool, action=EnvDefault, envvar="WEB_DEBUG", default=False, help="Enable web server debug", ) args = parser.parse_args(argv) from . import app from .app import Args args = Args(**vars(args)) app.main(args) return 0 if __name__ == "__main__": load_dotenv(".env") raise SystemExit(main())