#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 Так что просто не передавайте это в качестве аргумента.