Глава 2. Два CLI-тула в одном пакете

В первой главе мы сделали команду hello.
Теперь добавим ещё одну — bye, и у нас будет два отдельных CLI в одном проекте.


1. Добавляем второй файл bye.py

# bye.py
import sys

def main():
    name = sys.argv[1] if len(sys.argv) > 1 else "friend"
    print(f"Bye, {name}!")

2. Обновляем pyproject.toml

В блоке [project.scripts] можно перечислить сколько угодно команд.
А чтобы setuptools не психовал («Multiple top-level modules discovered…»), нужно явно сказать, какие .py файлы — это наши модули.

[project]
name = "hello-tool"
version = "0.2.0"
requires-python = ">=3.10"
dependencies = []

[project.scripts]
hello = "hello:main"
bye = "bye:main"

[tool.uv]
package = true

[tool.setuptools]
py-modules = ["hello", "bye"]

3. Обновляем зависимости/синхронизацию

uv sync

Если уже ставил глобально — просто обнови:

uv tool upgrade hello-tool

4. Проверяем

Локально:

uv run hello Alice
uv run bye Bob

Глобально:

hello Alice
bye Bob

💡 Фишка: оба скрипта сидят в одном пакете, но при установке создаются отдельные команды. Это прям как в npm bin, когда у тебя несколько CLI внутри одного пакета.