웹사이트 검색

Ubuntu 22.04에서 Python Fire로 CLI를 만드는 방법


소개

Python Fire는 Python 개체에서 자동으로 CLI(명령줄 인터페이스)를 사용할 수 있게 해주는 Python 라이브러리입니다. CLI는 명령줄에서 텍스트 입력을 받는 프로그램이며 개발 및 디버깅 워크플로우에 도움이 될 수 있습니다. 이는 Bash와 명령줄에 더 익숙한 사람들에게 유용할 수 있습니다.

표준 Python 라이브러리에서 argparse를 사용하는 기존 방법은 동일한 작업을 수행할 수 있지만 Python Fire 프로토타이핑 및 유지 관리가 크게 향상되었습니다. 완전한 제어를 원한다면 argparse를 사용하여 Python에서 명령줄 프로그램을 작성하는 방법에 대한 이 자습서를 확인하십시오.

이 튜토리얼에서는 Python Fire를 설치하고 이를 사용하여 사용자 정의 CLI를 생성합니다. 이러한 CLI는 Python 소스 코드를 건드리지 않고도 만들 수 있습니다. 또는 함수와 클래스에 직접 연결되는 보다 세분화된 스크립트의 경우 Python Fire를 가져와서 코드 자체에서 작업하게 됩니다.

전제 조건

  • Ubuntu 22.04용 초기 서버 설정 가이드에 따라 sudo 권한이 있고 방화벽이 활성화된 루트가 아닌 사용자로 설정된 Ubuntu 22.04 서버.
  • Python 3을 설치하고 Ubuntu 22.04 서버에서 프로그래밍 환경을 설정하는 방법에 따라 생성된 가상 환경과 함께 컴퓨터에 설치된 최신 버전의 Python 3.
  • 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

firePython 프로그램에 코드를 추가하지 않고 명령줄을 포함하여 여러 가지 방법으로 호출할 수 있습니다. 다음으로 이 메서드를 탐색하고 나중에 이를 실제 코드에 추가하여 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를 눌러 이 작업을 수행합니다.

이것은 my_name이라는 Python 함수이며 name이라는 하나의 인수를 사용합니다. 필수 변수와 함께 이 함수를 호출하면 Python 문자열 형식을 사용하여 name 변수를 문장에 삽입합니다. sammy를 변수로 사용하여 Python 인터프리터에서 이 코드를 실행하면 "My name is sammy\가 출력됩니다.

Python Fire를 사용하면 변수를 호출하기 위해 Python 코드를 작성하지 않고도 이 기존 Python 코드를 CLI 명령으로 전환하고 변수를 삽입하는 동안 이 코드를 실행할 수 있습니다. -m을 사용하여 Python 모듈로 호출하는 새 CLI 명령을 입력합니다.

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

여기에서 실행하려는 Python 프로그램으로 example을 지정하고 구체적으로 실행하려는 함수로 my_name을 지정합니다. my_namename이라는 하나의 인수가 필요한 함수이므로 --name 플래그를 사용하여 인수를 제공합니다.

Python 코드를 변경하지 않고 CLI 작동 베어본을 빌드했습니다.

3단계 - 가져온 fire를 사용하여 프로그램에서 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는 처음에 가져옵니다. 나중에 CLI 기능을 활성화하는 fire.Fire() 호출로 마지막에 호출됩니다. 이는 사용자가 Python 프로그램을 직접 실행할 때만 발생하며 이 파일을 다른 Python 스크립트로 가져올 때는 실행되지 않습니다. my_name 함수 자체는 변경되지 않습니다.

파일을 저장하고 종료합니다.

이제 다음 명령을 입력하여 CLI를 사용할 수 있습니다.

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

이제 fire가 처음에 Python 코드로 가져오기 때문에 더 이상 python -m을 통해 명령 내에서 fire 모듈을 호출할 필요가 없습니다. . 대신 파일을 통해 CLI를 직접 호출하고 함수 이름 및 변수에 대한 인수를 제공할 수 있습니다.

이렇게 하면 실제 코드를 수정해야 하는 대신 더 깔끔한 CLI 환경을 제공합니다. 다음으로 전체 Python 프로그램 대신 함수에서 직접 CLI를 생성합니다.

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 함수 함수는 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에서 두 함수 중 하나를 호출할 수 있습니다. 다음으로 함수 대신 Python 클래스에서 CLI를 생성합니다.

5단계 - 클래스에서 CLI 생성

클래스에 있든 함수에만 있든 코드를 구조화하는 방법은 선호도와 모범 사례에 대한 개인적 고수의 문제입니다. Python Fire를 사용하여 클래스에서 CLI를 생성하는 것은 함수와 크게 다르지 않습니다.

클래스를 만들려면 코드를 재구성하여 함수를 클래스의 일부로 배치해야 합니다. 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

생성된 CLI는 이전 단계와 완전히 동일한 명령을 사용하여 기능적으로 동일합니다. fire.Fire 호출도 동일합니다. 변경된 유일한 사항은 클래스를 사용하도록 코드를 재구성한 것입니다.

Python Fire는 사용자의 기본 설정에 적응하므로 클래스 또는 일반 함수를 사용하여 원하는 방식으로 코딩할 수 있습니다.

결론

이 자습서에서는 Python Fire를 설치한 다음 Python 프로그램, 함수 및 클래스를 사용하여 사용자 정의 CLI를 만드는 여러 가지 방법을 살펴보았습니다. 더 깊이 알아보려면 argparse를 사용하여 Python에서 명령줄 프로그램을 작성하는 방법을 확인하세요.