#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)