Рубрики
Без рубрики

Создайте и тестируйте интерфейс командной строки с помощью поэзии, аргпарсе Python и Pteest

Пакет ArgParse Pathna Python Standard библиотеки является официально рекомендуемым способом построить C … Помечено Python, командная строка, Pтойца, Python Poetry.

Собственная библиотека 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”