Собственная библиотека Python Standard argparse Пакет является официально рекомендуемым способом построить интерфейс командной строки (CLI) в Python.
Поэзия Является зрелым и современным способом управления проектом Python и его зависимостями. Возможно, вы наслаждаетесь чтением Мое введение в поэзию а также краткое Объяснение использования поэзии для выставления сценариев командной строки В вашем проекте.
Я также задокументировал, используя поэзию одним щелчком мыши и с помощью пожара Python. Это удобные и гибкие сторонние пакеты Python для генерации CLI. Там, где он подходит, информация о настройке поэзии в этой статье очень похожа на настройку поэзии в этих статьях.
Создайте проект и добавьте модуль
poetry new --name greet --src argparsegreet cd argparsegreet
Добавить файл под названием приветствовать
в SRC/Greet
подкаталог, со следующим содержанием:
"""Send greetings.""" import time import arrow def greet(tz, repeat=1, interval=3): """Parse a timezone and greet a location a number of times.""" for i in range(repeat): if i > 0: # no delay needed on first round time.sleep(interval) now = arrow.now(tz) friendly_time = now.format("h:mm a") seconds = now.format("s") location = tz.split("/")[-1].replace("_"," ") print(f"Hello, {location}!") print(f"The time is {friendly_time} and {seconds} seconds.\n")
Вы также можете получить вместо того, чтобы копировать Мой приветствовать
Гист в соответствующий каталог, с чем-то вроде это:
curl https://gist.githubusercontent.com/bowmanjd/e34dbd88af7e7a718c129b6676f1ba5e/raw > src/greet/greet.py
Поскольку загрузка произвольного кода из Интернета кажется довольно хорошим ходом.
Установка зависимостей
Нам нужно Стрелка Так что следует добавить сейчас:
poetry add arrow
Добавьте конечную точку скрипта в pyproject.toml
Выставить приветствовать
Функция как скрипт командной строки, добавьте tool.poetry.kcripts
Раздел для pyproject.toml
Отказ
[tool.poetry.scripts] greet = "greet.greet:greet"
Это устанавливает приветствовать
Сценарий, чтобы посмотреть в приветствовать
Пакет для приветствовать
Модуль и использование приветствовать
функция.
Мне нравится повторять свои избытки в течение нескольких раз.
Теперь, когда сценарий установлен, установите пакет и скрипт с помощью
poetry install
Запуск вновь установленного скрипта …
$ poetry run greet Traceback (most recent call last): File "", line 1, in TypeError: greet() missing 1 required positional argument: 'tz'
Казалось, казалось хорошей идеей в то время.
Использование аргументов ArgParse для аргументов командной строки
Чтобы сделать эту работу, нам нужно определить аргументы командной строки и пройти теми, как параметры для приветствовать
функция.
Поэтому мы обращаемся к собственной библиотеке Python Standard argparse Отказ
Во-первых, Импорт argparse
и добавьте функцию обработки команды в код, определяющий каждый аргумент и опцию. Результат должен прочитать что-то вроде этого:
"""Send greetings.""" import argparse import time import arrow def greet(tz, repeat=1, interval=3): """Parse a timezone and greet a location a number of times.""" for i in range(repeat): if i > 0: # no delay needed on first round time.sleep(interval) now = arrow.now(tz) friendly_time = now.format("h:mm a") seconds = now.format("s") location = tz.split("/")[-1].replace("_", " ") print(f"Hello, {location}!") print(f"The time is {friendly_time} and {seconds} seconds.\n") def cli(): parser = argparse.ArgumentParser() parser.add_argument("tz", help="The timezone") parser.add_argument( "-r", "--repeat", help="number of times to repeat the greeting", default=1, type=int, ) parser.add_argument( "-i", "--interval", help="time in seconds between iterations", default=3, type=int, ) args = parser.parse_args() greet(args.tz, args.repeat, args.interval)
По сравнению с кликом и огнем функция обработки команды немного сложнее, но не запрещено так.
Сначала мы создаем парсер с argparse. ArgumentParser ()
Затем добавьте каждый аргумент с отдельным Add_argument ()
, указав имя аргумента или опции, и, если необходимо, значение по умолчанию и тип (если нет строки). Обратите внимание, что глазуе имя, такое как "ТЗ"
обозначает позиционную аргумент, при этом префиксирует его с -
или -
делает его именованным вариантом, таким как "- серо"
Отказ В приведенном выше примере я указал как короткие, так и длинные варианты (например, -r
и - Сепей
).
CLI ()
Функция, не приветствовать ()
, должен быть скрипт конечной точки, так pyproject.toml
должен иметь незначительную корректировку:
[tool.poetry.scripts] greet = "greet.greet:cli"
Теперь попробуйте Поэзия бежит приветствовать --help
Полезный.
$ poetry run greet -r 2 -i 1 Asia/Damascus Hello, Damascus! The time is 2:23 pm and 56 seconds. Hello, Damascus! The time is 2:23 pm and 57 seconds.
Оно работает! Нужны некоторые тесты, чтобы постоянно убедиться, что, хотя. Спасибо, pteest Отказ
Тестирование интерфейсов argparse с ptest
Тестирование интерфейсов командной строки заслуживает некоторого размышления.
Хотя другие библиотеки CLI обеспечивают функции помощника, argparse нет, из коробки. Однако, реструктурируя код слегка, становится легче тестировать.
Изменяя CLI ()
Функция Чтобы принять ARGS, мы можем отправить список аргументов в наших тестах. Если args не указаны, sys.argv.
должен быть использован. Так CLI ()
Функция может прочитать:
def cli(args=None): if not args: args = sys.argv[1:] parser = argparse.ArgumentParser() parser.add_argument("tz", help="The timezone") parser.add_argument( "-r", "--repeat", help="number of times to repeat the greeting", default=1, type=int, ) parser.add_argument( "-i", "--interval", help="time in seconds between iterations", default=3, type=int, ) args = parser.parse_args(args) greet(args.tz, args.repeat, args.interval)
Кроме принятия и тестирования на существование args
, ключевая разница вот что мы проходим args
к parse_args ()
Отказ Другими словами parse_args ()
Функция будет использовать список аргументов, если указано (он использует sys.argv.
если не).
Теперь мы можем поставить следующие тесты/Test_GreeT.py:
from greet.greet import cli def test_greet_cli(capsys): cli(["Asia/Jakarta"]) captured = capsys.readouterr() result = captured.out assert "Hello, Jakarta!" in result
Как видно выше, CLI ()
Функция теперь принимает список аргументов командной строки.
Я использовал pteest’s капсис
приспособление захватить вывод.
Делает Поэзия бежит Pteest
проходят?
Удовлетворение.
Опять же, посмотрите на аналогичный учебник, связанный с кликом, а другой о пожаре Python, если он заинтересован в изучении этих инструментов.
Оригинал: “https://dev.to/bowmanjd/build-and-test-a-command-line-interface-with-poetry-python-s-argparse-and-pytest-4gab”