A task runner that works well with poetry or uv.
2,076
stars
407
commits
Python
primary language
Jul 12, 2026
updated
A batteries included task runner that works well with poetry or uv.
π Read the documentation π
β 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 poe with no arguments)
β Tasks can be composed to run in sequence, in parallel, or as a DAG.
β
Works with .env files
β 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
pipx install poethepoet
Or add it as a poetry project plugin:
[tool.poetry.requires-plugins]
poethepoet = ">=0.48"
[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}"}
]
$ 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.
There's plenty to do, come say hi in the discussions or open an issue! π
Also check out the CONTRIBUTING guide π€
(top 30 of 44)
Python
100.0%
A task runner that works well with poetry or uv.
2,076
stars
407
commits
Python
primary language
Jul 12, 2026
updated
A batteries included task runner that works well with poetry or uv.
π Read the documentation π
β 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 poe with no arguments)
β Tasks can be composed to run in sequence, in parallel, or as a DAG.
β
Works with .env files
β 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
pipx install poethepoet
Or add it as a poetry project plugin:
[tool.poetry.requires-plugins]
poethepoet = ">=0.48"
[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}"}
]
$ 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.
There's plenty to do, come say hi in the discussions or open an issue! π
Also check out the CONTRIBUTING guide π€
(top 30 of 44)
Python
100.0%