A task runner that works well with poetry or uv.
Overview
- ✅ Straight forward declaration of project tasks in your pyproject.toml (or poe_tasks.toml) - ✅ Tasks are run in poetry or uv's virtualenv (or another env you specify) - ✅ Shell completion of task names and arguments - ✅ The poe CLI can be used standalone, or as a plugin for poetry - ✅ Tasks can be commands, shell scripts, python expressions, or references to python functions - ✅ Concise commands with extra arguments passed to the task poe [options] task [task_args] - ✅ Easily declare named CLI arguments for your tasks - ✅ Tasks can specify and reference environment variables, even without a shell
README
Poe the Poet
A batteries included task runner that works well with poetry or uv.
Features
-
✅ Straight forward declaration of project tasks in your pyproject.toml (or poe_tasks.toml)
-
✅ Tasks are run in poetry or uv’s virtualenv (or another env you specify)
-
✅ Shell completion of task names and arguments
-
✅ The poe CLI can be used standalone, or as a plugin for poetry
-
✅ Tasks can be commands, shell scripts, python expressions, or references to python functions
-
✅ Concise commands with extra arguments passed to the task
poe [options] task [task_args] -
✅ Easily declare named CLI arguments for your tasks
-
✅ Tasks can specify and reference environment variables, even without a shell
-
✅ Tasks are self documenting, with optional help messages and task grouping (just run
poewith no arguments) -
✅ Tasks can be composed to run in sequence, in parallel, or as a DAG.
-
✅ Works with
.envfiles -
✅ Can be used as a library to embed in other tools
-
✅ Tasks can be defined in python packages for ease of reuse across projects
-
✅ Also works fine as a general purpose task runner
-
✅ Ships with an official Agent Skill to help AI coding agents use poe effectively
Quick start
- Install the Poe the Poet globally via pipx or another method.
pipx install poethepoet
Or add it as a poetry project plugin:
[tool.poetry.requires-plugins]
poethepoet = ">=0.49"
- Define some tasks in your pyproject.toml
[tool.poe.tasks]
test = "pytest --cov=my_app" # a simple command task
serve.script = "my_app.service:run(debug=True)" # python script based task
tunnel.shell = "ssh -N -L 0.0.0.0:8080:$PROD:8080 $PROD &" # (posix) shell based task
# A more complete example with documentation and named arguments
[tool.poe.tasks.count-incomplete]
help = "Count incomplete tasks in DynamoDB"
cmd = """
aws dynamodb scan --table-name tasks
--select "COUNT"
--filter-expression "status >= :status"
--expression-attribute-values '{":status":{"S":"incomplete"}}'
--no-cli-pager
"""
args = [
# Allow $AWS_REGION to be overridden with a CLI option when calling the task
{name = "AWS_REGION", options = ["--region", "-r"], default = "${AWS_REGION}"}
]
- Run your tasks via the CLI
$ poe test -v tests/unit # extra CLI arguments are appended to the underlying command
Poe => pytest --cov=my_app
...
If you’re using poetry or uv, then poe will automatically use CLI tools and libraries from your project’s virtualenv without you having to run poetry run / uv run
Poe can also be used as a general purpose task runner.
Contributing
There’s plenty to do, come say hi in the discussions or open an issue! 👋
Also check out the CONTRIBUTING guide 🤓
License
Recommended Tools
Try a different keyword or remove a filter.
Install
npx skillfish add nat-n/poethepoet