Отдельные команды CLI для нескольких файлов Python

#python #python-click

Вопрос:

Я пытаюсь упаковать интерфейс командной строки, разработанный с помощью библиотеки Click. Чтобы поэкспериментировать, я создал еще одно приложение для тестирования CLI с командами, которые ничего не делают для проверки.

Моя структура каталогов выглядит следующим образом:

 Grouptest gt; scripts  gt; __init__.py  gt; amogus.py  gt; maintest.py gt; main.py gt; utils.py gt; Grouptest.egg-info gt; setup.py  

Как бы я разделил команды щелчка мыши на отдельные сценарии и мне не пришлось бы выполнять 2 команды?

Например, если бы моим общим префиксом команды был префикс testcli1 , я хотел бы иметь возможность вызывать команды в maintest с testcli1 maintest помощью и команды в amogus.py с testcli1 amongus помощью .

Я попытался сделать @click.group деко maintest.py , а затем amogus.py импортировал необходимый деко @click.group из maintest.py , но когда я устанавливаю с pip install -e . помощью , когда я вызываю maintest, он не распознает команды из amogus.py .

Как разделить команды на несколько файлов python? Я действительно не хочу создавать файл объединения, это было бы кошмаром.

Ответ №1:

Допустим, у вас есть четыре файла-

  • entrypoint.py (точка входа для вашего сценария)
  • main.py (создайте группу)
  • a.py (команда)
  • b.py (команда b)

  • в main.py создайте группу click.group
  • в командных файлах импортируйте эту группу из main и украсьте свои команды
  • в entrypoint импортируйте все остальные файлы и выполните свою группу.

ПОРЯДОК импорта в вашей точке входа имеет значение! Если a или b не импортированы, их команды просто не будут зарегистрированы.

Но эти файлы не работают, если они импортированы до создания группы.

У вас есть возможность немного поколдовать в файле точки входа (поиск всех файлов и их импорт), но обычно я просто делаю это вручную.

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

1. Буду ли я вставлять инструкции импорта внутри click.group?

2. Я обычно использую отдельный файл (entrypoint.py), чтобы это сработало. Вы МОГЛИ БЫ создать группу, а ЗАТЕМ импортировать дочерние файлы, но мне не нравится, как это выглядит. (если вы импортируете их в верхней части group.py, вы получите циклические ошибки импорта)

3. Хорошо, вы упомянули «немного поработать с файлом точки входа, выполнив поиск всех файлов и импортировав их». Не могли бы вы подробнее остановиться на этом?

4. магия была экстремальной. Что-то вроде for path in Path(__file__).parent.iterdir(): importlib.import_module(str(path)