From Random Scripts to a Real Python Package (Part 1)
DEV Community

From Random Scripts to a Real Python Package (Part 1)

The Moment I Realized My Python Project Wasn't Really a Project

When I first started learning Python, my projects were about as simple as they could be.

project/
├── logic.py
└── main.py

If I wanted to run the program, I simply typed:

python main.py

If I needed another function, I created another file and imported it.

from logic import calculate

Everything worked. At the time, I thought this was what "organizing a Python project" meant. I was wrong.

A Collection of Scripts Is Not a Software Project

Over the past few months, I've been rebuilding Python's built-in functions from scratch as a way to understand how they actually work. Instead of solving algorithm exercises, I implemented functions like:

  • map()
  • filter()
  • any()
  • all()
  • max()
  • min()

One function became ten. Ten became dozens. Soon I wasn't just writing code anymore. I started writing documentation for each implementation. I added tests. I kept notes about design decisions. I experimented with different implementations. Without realizing it, what began as a few learning scripts slowly evolved into a real project. Unfortunately, my project structure never evolved with it.

Documentation Everywhere

At first, I stored documentation wherever it felt convenient. Some notes were inside Markdown files. Some were buried in my note-taking application. Others existed only inside commit messages. Every time I came back to the project, I had to spend several minutes remembering questions like:

  • Where did I explain this implementation?
  • Which version of this function is the latest?
  • Why did I choose this approach?
  • Where are the tests?

Nothing was technically broken. But nothing felt organized either. That was when I realized something interesting. The biggest problem wasn't my code. It was the environment surrounding my code.

"Maybe I Should Treat This Like a Real Project"

My first instinct was incredibly simple. Create a folder.

pycore/

Then create a virtual environment.

python -m venv .venv

Problem solved. Or so I thought.

The more I read the official Python Packaging documentation, the more I realized that a virtual environment is only one small piece of a much larger picture. I had always thought "setting up a project" meant creating a folder and installing packages. But a reusable software project needs much more than that.

Questions I had never asked before suddenly became important.

  • Where should the source code live?
  • How should dependencies be declared?
  • Where do tests belong?
  • How should documentation be organized?
  • How do other people install this project?
  • What exactly is pyproject.toml ?

These weren't Python syntax questions. They were software engineering questions.

Learning Packaging Was Really Learning Software Design

At first, I assumed Python Packaging was simply about publishing libraries to PyPI. I wasn't planning to publish anything. I just wanted a clean project structure. Ironically, that decision led me into an entirely different world.

I started reading Packaging User Guide documentation. I discovered concepts like build systems, dependency management, editable installations, source layouts, and package metadata. None of these topics had anything to do with writing better algorithms. Instead, they answered a different question. How should a software project be organized so that both humans and tools can understand it?

Looking back, that was the point where I stopped thinking like someone writing Python scripts and started thinking like someone building software.

What's Next

Before deciding where my code should live or what should go inside pyproject.toml, I first needed to understand something much more fundamental. What actually makes up a Python project's environment? At the time, I thought the answer was simply "a virtual environment." It turns out that was only one piece of the puzzle.

In the next article, we'll build a mental model of a modern Python project by exploring the five concepts that completely changed how I think about Python Packaging.

Top comments (0)

Comments

No comments yet. Start the discussion.