Your Cookiecutter Is Wrong

My talk from EuroPython 2025

Abstract

Starting a new Python project comes with many decisions:

There’s no single standard for a Python project structure, and popular tools offer a lot of flexibility: uv can create a library, an application, or a packaged application, pytest documents two possible test layouts and supports three import modes, and mypy implements its own import mechanism.

If you’re starting a library, you can take inspiration from open-source champions, but applications are usually proprietary. Many Cookiecutter templates exist online, but which one should you choose? A common approach is to clone an existing project your company uses, but in my experience, this isn’t always the best idea.

I’ll point out common mistakes to avoid. We’ll explore the key decisions and weigh the benefits and drawbacks of each option. My goal isn’t to sell you on my favorite directory structure. Instead, I’ll help you choose what suits your use case best, ensuring that your choices play well with each other.

Slides

PDF version

Your Cookiecutter Is Wrong - Slide 1 Your Cookiecutter Is Wrong - Slide 2 Your Cookiecutter Is Wrong - Slide 3 Your Cookiecutter Is Wrong - Slide 4 Your Cookiecutter Is Wrong - Slide 5 Your Cookiecutter Is Wrong - Slide 6 Your Cookiecutter Is Wrong - Slide 7 Your Cookiecutter Is Wrong - Slide 8 Your Cookiecutter Is Wrong - Slide 9 Your Cookiecutter Is Wrong - Slide 10 Your Cookiecutter Is Wrong - Slide 11 Your Cookiecutter Is Wrong - Slide 12 Your Cookiecutter Is Wrong - Slide 13 Your Cookiecutter Is Wrong - Slide 14 Your Cookiecutter Is Wrong - Slide 15 Your Cookiecutter Is Wrong - Slide 16 Your Cookiecutter Is Wrong - Slide 17 Your Cookiecutter Is Wrong - Slide 18 Your Cookiecutter Is Wrong - Slide 19 Your Cookiecutter Is Wrong - Slide 20 Your Cookiecutter Is Wrong - Slide 21 Your Cookiecutter Is Wrong - Slide 22 Your Cookiecutter Is Wrong - Slide 23 Your Cookiecutter Is Wrong - Slide 24 Your Cookiecutter Is Wrong - Slide 25 Your Cookiecutter Is Wrong - Slide 26 Your Cookiecutter Is Wrong - Slide 27 Your Cookiecutter Is Wrong - Slide 28 Your Cookiecutter Is Wrong - Slide 29 Your Cookiecutter Is Wrong - Slide 30 Your Cookiecutter Is Wrong - Slide 31 Your Cookiecutter Is Wrong - Slide 32 Your Cookiecutter Is Wrong - Slide 33 Your Cookiecutter Is Wrong - Slide 34 Your Cookiecutter Is Wrong - Slide 35 Your Cookiecutter Is Wrong - Slide 36 Your Cookiecutter Is Wrong - Slide 37 Your Cookiecutter Is Wrong - Slide 38 Your Cookiecutter Is Wrong - Slide 39 Your Cookiecutter Is Wrong - Slide 40 Your Cookiecutter Is Wrong - Slide 41 Your Cookiecutter Is Wrong - Slide 42 Your Cookiecutter Is Wrong - Slide 43 Your Cookiecutter Is Wrong - Slide 44 Your Cookiecutter Is Wrong - Slide 45 Your Cookiecutter Is Wrong - Slide 46 Your Cookiecutter Is Wrong - Slide 47 Your Cookiecutter Is Wrong - Slide 48