Поиск по сайту:

Как создать CLI с Python Fire в Ubuntu 22.04


Введение

Python Fire — это библиотека Python, которая позволяет автоматически создавать CLI (интерфейсы командной строки) из объектов Python. Интерфейсы командной строки — это программы, которые принимают текстовый ввод из командной строки и могут быть полезны для рабочего процесса разработки и отладки. Это может быть полезно для тех, кому удобнее работать с Bash и командной строкой.

В то время как традиционный метод использования argparse из стандартной библиотеки Python позволяет добиться того же результата, прототипирование и обслуживание Python Fire значительно улучшены. Если вам нужен полный контроль, ознакомьтесь с этим руководством о том, как использовать argparse для написания программ командной строки на Python.

В этом руководстве вы установите Python Fire и будете использовать его для создания пользовательских интерфейсов командной строки. Эти интерфейсы командной строки можно создавать, не прикасаясь к исходному коду Python. В качестве альтернативы, для более детальных сценариев, которые напрямую связаны с вашими функциями и классами, вы будете импортировать Python Fire и работать с ним в самом своем коде.

Предпосылки

  • Сервер Ubuntu 22.04, настроенный в соответствии с нашим руководством по первоначальной настройке сервера для Ubuntu 22.04, с пользователем без полномочий root с привилегиями sudo и включенным брандмауэром.
  • Последняя версия Python 3, установленная на вашем компьютере, с созданной виртуальной средой в соответствии с инструкциями по установке Python 3 и настройке среды программирования на сервере Ubuntu 22.04.
  • Знакомство с языком Python и программированием на нем. Эта серия статей о том, как программировать на Python 3, может стать хорошим пособием для начинающих.

Шаг 1 — Установка Python Fire

Python Fire размещен на PyPI и может быть установлен из pip. Выполнив предварительные условия для установки Python 3, вы должны создать и активировать виртуальную среду. Если он у вас не включен, перейдите в каталог вашей среды:

  1. cd environments

Затем включите вашу виртуальную среду:

  1. source my_env/bin/activate

Это гарантирует, что ваша установка fire не повлияет на глобальные установки pip. Кроме того, установки pip на глобальном уровне могут непредсказуемо взаимодействовать с менеджерами пакетов, такими как apt. Включив виртуальную среду, установите fire:

  1. pip install fire

fire можно вызывать несколькими способами, в том числе из командной строки без добавления кода к вашим программам на Python. Затем вы изучите этот метод, а затем изучите обычное использование Python Fire, добавив его в свой реальный код, чтобы обеспечить более детальный контроль.

Шаг 2 — Создание CLI из программы без дополнений кода

Сначала настройте файл Python. Это может называться файлом, программой или сценарием, и все это правильно.

Чтобы создать новый файл, используйте nano или предпочитаемый вами текстовый редактор:

  1. nano example.py

Вставьте следующий код Python в новый файл:

def my_name(name):
  return "My name is {name}".format(name=name)

Сохраните и выйдите из файла. С nano вы делаете это, нажимая CTRL+O, а затем CTRL+X.

Это функция Python с именем my_name, и она принимает один аргумент с именем name. Вызов этой функции с требуемой переменной вставит переменную name в предложение с использованием форматирования строки Python. Если бы вы выполнили этот код в интерпретаторе Python с sammy в качестве переменной, он вывел бы \My name is sammy.

С помощью Python Fire вы можете превратить этот существующий код Python в команду CLI и выполнить этот код при вставке переменной, не прибегая к написанию кода Python для его вызова. Введите новую команду CLI, используя -m, чтобы вызвать ее как модуль Python:

  1. python -m fire example my_name --name=sammy
Output
My name is sammy

Здесь вы указываете example в качестве программы Python, которую вы хотите выполнить, с my_name в качестве функции, которую вы хотите запустить. Поскольку my_name — это функция, требующая одного аргумента с именем name, вы предоставляете аргумент с помощью флага --name.

Без каких-либо изменений в вашем коде Python вы создали базовый рабочий интерфейс командной строки.

Шаг 3 — Создание CLI из программы с импортированным огнем

Более традиционный способ использования Python Fire — импортировать fire в ваш код. Это обеспечивает более детальный контроль и более сложную структуру кода для использования в CLI.

Откройте свой example.py и вставьте следующий код:

import fire

def my_name(name):
  return "My name is {name}".format(name=name)

if __name__ == '__main__':
  fire.Fire()

Есть два заметных изменения в исходном коде. fire импортируется в начале. Позже он вызывается в конце с помощью вызова fire.Fire(), который включает функции CLI. Это произойдет только тогда, когда программа Python будет запущена пользователем напрямую, и не будет работать, когда этот файл будет импортирован в другой скрипт Python. Сама функция my_name не изменилась.

Сохраните и выйдите из файла.

Теперь вы можете использовать свой CLI, введя эту команду:

  1. python example.py my_name sammy
Output
My name is sammy

Поскольку fire теперь импортируется в ваш код Python в начале, вам больше не нужно вызывать модуль fire в вашей команде через python -m . Вместо этого вы можете напрямую вызывать CLI через файл и предоставлять аргументы для имени функции и переменной.

Это обеспечивает более чистое взаимодействие с интерфейсом командной строки за счет необходимости внесения изменений в ваш фактический код. Далее вы создадите CLI непосредственно из функции, а не всей программы Python.

Шаг 4 — Создание CLI из функции

Вместо того, чтобы предоставлять CLI все ваши функции в вашей программе, вы можете создать CLI из определенных функций. Вставьте следующее в ваш example.py:

import fire

def my_name(name):
  return "My name is {name}".format(name=name)

def my_full_name(first_name, last_name):
    return "My name is {first_name} {last_name}".format(first_name=first_name, last_name=last_name)

if __name__ == '__main__':
  fire.Fire(my_name)

Сохраните и выйдите из файла.

На этот раз есть две функции. Есть исходная функция my_name, а теперь вторая функция my_full_name. Функция my_full_name function немного отличается тем, что она принимает два аргумента, которые Python Fire может разрешить. Он будет использоваться позже в этом уроке.

Кроме того, когда в конце вызывается fire.Fire, теперь он принимает аргумент. Чтобы указать функцию, которую вы хотите использовать, вы должны указать ее здесь в качестве аргумента. В этом примере my_name будет тем, на который вы ориентируетесь для своего CLI.

Поскольку вы указали функцию, которая будет использоваться в CLI, в командной строке вам нужно только указать программу и аргумент, необходимые для выполнения функции:

  1. python example.py sammy
Output
My name is sammy

Обратите внимание, что в выходных данных возвращается только функция my_name, как вы указали. Новая функция my_full_name осталась нетронутой.

Однако вы можете предоставить несколько функций для своего CLI. Для этого передайте словарь Python в вызов fire.Fire. Использование словаря в качестве структуры данных ключ-значение позволяет указать несколько функций для CLI. Этот словарь будет содержать все функции, которые вы хотите использовать в CLI. Вставьте в example.py следующее:

import fire

def my_name(name):
  return "My name is {name}".format(name=name)

def my_full_name(first_name, last_name):
    return "My name is {first_name} {last_name}".format(first_name=first_name, last_name=last_name)

if __name__ == '__main__':
  fire.Fire({
      'my_name': my_name,
      'my_full_name': my_full_name,
  })

Теперь вы можете вызвать первую функцию через CLI:

  1. python example.py my_name sammy
Output
My name is sammy

Или вы можете вызвать свою вторую функцию:

  1. python example.py my_full_name sammy shark
Output
My name is sammy shark

Единственное изменение на этот раз — передача словаря. Со словарем вы можете вызывать любую функцию из вашего CLI. Далее вы будете создавать CLI из класса Python, а не из функции.

Шаг 5 — Создание CLI из класса

То, как вы структурируете свой код, будь то классы или только функции, зависит от ваших предпочтений и личной приверженности лучшим практикам. Создание CLI из классов с помощью Python Fire не сильно отличается от функций.

Чтобы создать класс, вы будете реструктурировать свой код, помещая в него свои функции как часть класса. Вставьте следующее в example.py

import fire

class Namer(object):
    def my_name(self, name):
        return "My name is {name}".format(name=name)

    def my_full_name(self, first_name, last_name):
        return "My name is {first_name} {last_name}".format(first_name=first_name, last_name=last_name)

if __name__ == '__main__':
  fire.Fire(Namer)

Теперь, несмотря на рефакторинг вашего кода для использования классов, вы можете использовать ту же команду из предыдущего шага, чтобы вызвать первую функцию через ваш CLI:

  1. python example.py my_name sammy
Output
My name is sammy

Или вы можете вызвать свою вторую функцию:

  1. python example.py my_full_name sammy shark
Output
My name is sammy shark

Созданный интерфейс командной строки функционально идентичен и использует те же самые команды, что и на предыдущем шаге. Вызов fire.Fire такой же. Единственное, что изменилось, это реструктуризация кода для использования классов.

Python Fire адаптируется к вашим предпочтениям, позволяя вам кодировать так, как вы предпочитаете, используя классы или обычные функции.

Заключение

В этом руководстве вы установили Python Fire, а затем изучили несколько способов создания собственных пользовательских интерфейсов командной строки с использованием программ, функций и классов Python. Для еще более глубокого погружения ознакомьтесь с тем, как использовать argparse для написания программ командной строки на Python.