
python-packaging
โ 37,559by wshobson ยท part of wshobson/agents
Create distributable Python packages with proper project structure, setup.py/pyproject.toml, and publishing to PyPI. Use when packaging Python libraries, creating CLI tools, or distributing Python code.
This is the playbook your agent receives when the skill activates โ you don't need to read it to use the skill, but it's here to audit before installing.
Python Packaging
Comprehensive guide to creating, structuring, and distributing Python packages using modern packaging tools, pyproject.toml, and publishing to PyPI.
When to Use This Skill
- Creating Python libraries for distribution
- Building command-line tools with entry points
- Publishing packages to PyPI or private repositories
- Setting up Python project structure
- Creating installable packages with dependencies
- Building wheels and source distributions
- Versioning and releasing Python packages
- Creating namespace packages
- Implementing package metadata and classifiers
Core Concepts
1. Package Structure
- Source layout:
src/package_name/(recommended) - Flat layout:
package_name/(simpler but less flexible) - Package metadata: pyproject.toml, setup.py, or setup.cfg
- Distribution formats: wheel (.whl) and source distribution (.tar.gz)
2. Modern Packaging Standards
- PEP 517/518: Build system requirements
- PEP 621: Metadata in pyproject.toml
- PEP 660: Editable installs
- pyproject.toml: Single source of configuration
3. Build Backends
- setuptools: Traditional, widely used
- hatchling: Modern, opinionated
- flit: Lightweight, for pure Python
- poetry: Dependency management + packaging
4. Distribution
- PyPI: Python Package Index (public)
- TestPyPI: Testing before production
- Private repositories: JFrog, AWS CodeArtifact, etc.
Package Structure Patterns
Pattern 1: Source Layout (Recommended)
my-package/
โโโ pyproject.toml
โโโ README.md
โโโ LICENSE
โโโ .gitignore
โโโ src/
โ โโโ my_package/
โ โโโ __init__.py
โ โโโ core.py
โ โโโ utils.py
โ โโโ py.typed # For type hints
โโโ tests/
โ โโโ __init__.py
โ โโโ test_core.py
โ โโโ test_utils.py
โโโ docs/
โโโ index.mdAdvantages:
- Prevents accidentally importing from source
- Cleaner test imports
- Better isolation
pyproject.toml for source layout:
[tool.setuptools.packages.find]
where = ["src"]Pattern 2: Flat Layout
my-package/
โโโ pyproject.toml
โโโ README.md
โโโ my_package/
โ โโโ __init__.py
โ โโโ module.py
โโโ tests/
โโโ test_module.pySimpler but:
- Can import package without installing
- Less professional for libraries
Pattern 3: Multi-Package Project
project/
โโโ pyproject.toml
โโโ packages/
โ โโโ package-a/
โ โ โโโ src/
โ โ โโโ package_a/
โ โโโ package-b/
โ โโโ src/
โ โโโ package_b/
โโโ tests/Detailed patterns and worked examples
Detailed pattern documentation lives in references/details.md. Read that file when the navigation tier above is insufficient.
npx skills add https://github.com/wshobson/agents --skill python-packagingRun this in your project โ your agent picks the skill up automatically.
Quick Start
Minimal Package Structure
my-package/
โโโ pyproject.toml
โโโ README.md
โโโ LICENSE
โโโ src/
โ โโโ my_package/
โ โโโ __init__.py
โ โโโ module.py
โโโ tests/
โโโ test_module.pyMinimal pyproject.toml
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "my-package"
version = "0.1.0"
description = "A short description"
authors = [{name = "Your Name", email = "you@example.com"}]
readme = "README.md"
requires-python = ">=3.8"
dependencies = [
"requests>=2.28.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0",
"black>=22.0",
]No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.
Licensed under MITโ you can use, modify, and redistribute it under that license's terms.
View the full license file on GitHub โ