Как создать 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, вы должны создать и активировать виртуальную среду. Если он у вас не включен, перейдите в каталог вашей среды:
- cd environments
Затем включите вашу виртуальную среду:
- source my_env/bin/activate
Это гарантирует, что ваша установка fire
не повлияет на глобальные установки pip
. Кроме того, установки pip
на глобальном уровне могут непредсказуемо взаимодействовать с менеджерами пакетов, такими как apt
. Включив виртуальную среду, установите fire
:
- pip install fire
fire
можно вызывать несколькими способами, в том числе из командной строки без добавления кода к вашим программам на Python. Затем вы изучите этот метод, а затем изучите обычное использование Python Fire, добавив его в свой реальный код, чтобы обеспечить более детальный контроль.
Шаг 2 — Создание CLI из программы без дополнений кода
Сначала настройте файл Python. Это может называться файлом, программой или сценарием, и все это правильно.
Чтобы создать новый файл, используйте nano
или предпочитаемый вами текстовый редактор:
- 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:
- python -m fire example my_name --name=sammy
OutputMy 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, введя эту команду:
- python example.py my_name sammy
OutputMy 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, в командной строке вам нужно только указать программу и аргумент, необходимые для выполнения функции:
- python example.py sammy
OutputMy 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:
- python example.py my_name sammy
OutputMy name is sammy
Или вы можете вызвать свою вторую функцию:
- python example.py my_full_name sammy shark
OutputMy 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:
- python example.py my_name sammy
OutputMy name is sammy
Или вы можете вызвать свою вторую функцию:
- python example.py my_full_name sammy shark
OutputMy name is sammy shark
Созданный интерфейс командной строки функционально идентичен и использует те же самые команды, что и на предыдущем шаге. Вызов fire.Fire
такой же. Единственное, что изменилось, это реструктуризация кода для использования классов.
Python Fire адаптируется к вашим предпочтениям, позволяя вам кодировать так, как вы предпочитаете, используя классы или обычные функции.
Заключение
В этом руководстве вы установили Python Fire, а затем изучили несколько способов создания собственных пользовательских интерфейсов командной строки с использованием программ, функций и классов Python. Для еще более глубокого погружения ознакомьтесь с тем, как использовать argparse для написания программ командной строки на Python.