Нажмите невозможно зарегистрировать групповую команду

#python #bash #python-click

#python #bash #python-нажмите

Вопрос:

Я пытаюсь запустить click cli через bash с помощью разных групп команд, выполняемых через одну коллекцию команд.

src/preprocessing_extract_data/scripts/main.py

 import click 

@click.group()
def run_preprocessing_extract_data():
    pass


@run_preprocessing_extract_data.command()
@click.option(
    "--start_date",
    type=click.DateTime(formats=["%Y-%m-%d"]),
    required=True,
    help="Start date for the pipeline",
)
@click.option(
    "--end_date",
    type=click.DateTime(formats=["%Y-%m-%d"]),
    required=True,
    help="End date for the pipeline",
)
def main(start_date, end_date):
    ...

if __name__ == "__main__":
    main()
 

src/scripts/main.py

 from click import CommandCollection

from src.preprocessing_extract_data.scripts.main import run_preprocessing_extract_data

if __name__ == "__main__":
    cmds = [
        run_preprocessing_extract_data,
        # a few more similar command groups
    ]
    cli = CommandCollection(sources=cmds)
    cli()
 

scripts/entrypoint.sh

 #!/bin/sh
start_date="$1"
end_date="$2"

python src/scripts/main.py run_preprocessing_extract_data --start_date=$start_date --end_date=$end_date 
 

Я запускаю его с помощью ./scripts/entrypoint.sh --start_date="2020-11-01" --end_date="2021-12-01" --today="2021-12-10" , но он продолжает выходить из строя и выдает следующую ошибку:

 Usage: main.py [OPTIONS] COMMAND [ARGS]...
Try 'main.py --help' for help.

Error: No such command 'run_preprocessing_extract_data'.
 

Комментарии:

1. run_preprocessing_extract_data группа, но main имя команды, поэтому вы должны вызвать этот скрипт в main качестве аргумента.

2. Не могли бы вы добавить ответ? Мне все еще не так ясно @a_guest.

Ответ №1:

Из документов:

Реализацией по умолчанию для такой системы слияния является CommandCollection класс. Он принимает список других мультикоманд и делает команды доступными на том же уровне.

Следовательно, в вашем скрипте теперь есть команда main ; вы можете проверить это, запустив свой скрипт с --help аргументами (или вообще без аргументов): python src/scripts/main.py --help .

Следовательно, вы можете сделать следующее:

 python src/scripts/main.py main --start_date="$start_date" --end_date="$end_date"
 

Кстати, вызов вашего сценария оболочки должен выполняться без --start_date : ./scripts/entrypoint.sh "2020-11-01" "2021-12-01" .

Комментарии:

1. Хорошо, я попробовал это main сделать, и это работает. Но когда я меняю имя команды main_preprocessing_extract_data , оно внезапно не работает. У меня есть несколько команд, которые мне нужно запустить, и в настоящее время все они имеют одно и то же имя main , поэтому мне нужен способ их различать.

2. Хорошо, я понял это, мне нужно преобразовать подчеркивания в тире, вот так main-preprocessing-extract-data , это исправлено. Но теперь другая проблема, для некоторых команд требуется другой аргумент today , который также передается через скрипт bash, и теперь он говорит, что main.py main-preprocessing-extract-data он не принимает его.

3. @yudhiesh Так что просто не передавайте это в качестве аргумента.