파이썬 CLI 프로그램 배포를 위한 최선의 선택! pipx#
파이썬으로 만들어진 프로그램을 배포한 후 실행하려면 크게 2가지 방법이 사용됩니다.
운영체제에서 바로 실행 가능한 형태로 변환하고 배포하기
파이썬 패키지 파일로 묶어서 배포하기
개별의 배포 방법은 배포하려는 파이썬 프로그램의 특징에 따라 다릅니다. 첫 번째로 살펴볼 “운영체제에서 바로 실행 가능한 형태로 변환하고 배포하기” 입니다.
일반적으로 파이썬으로 작성된 프로그램은 스크립트 파일 형태로 파이썬 인터프리터(python.exe)가 시스템에 설치되어 있어야만 실행할 수 있습니다.
여러분이 만든 파이썬 스크립트를 복사해서 다른 이에게 배포하면 십중팔구로 스크립트 파일을 전달받은 사람은 “이걸 어떻게 실행해?”라며 당황합니다.
이런 이유로 파이썬 스크립트를 다른 이에게 전달하기 이전에 배포받는 사람이 쉽게 실행할 수 있도록 exe 파일이나 맥이나 리눅스에서 실행 가능한 바이너리로 묶어서 배포해야 합니다.
여기에 사용하는 여러 파이썬 도구가 있으며 향후 소개하겠습니다.
두 번째로 살펴볼 “파이썬 패키지 파일로 묶어서 배포하기” 방법은 배포하려는 파이썬 프로그램이 라이브러리로서의 성격을 가지고 있거나 셸(shell)에서 바로 실행 가능한 파이썬 프로그램을 배포하기 위해서입니다.
파이썬 패키지 파일은 일반적으로 wheel 타입의 whl 확장자를 가진 파일이 배포되기 때문에 배포받는 사람의 컴퓨터에 파이썬 인터프리터가 설치되어 있어야 합니다.
드문 경우이긴 하지만 파이썬 패키지가 요구하는 최소 파이썬 버전이 시스템에 설치된 파이썬 버전보다 높은 경우 패키지 설치에 실패하기도 합니다.
콘솔 스크립트의 등장#
파이썬은 패키지 파일을 설치하면서 패키지 파일 내부에 정의되어 있는 “콘솔 스크립트” 를 설치해주는 기능이 있습니다.
파이썬 패키지 파일 내부에 정의되어 있는 콘솔 스크립트는 패키지 파일에 포함되어 있는 특정 파이썬 스크립트를 배포하는 운영체제의 셸에서 바로 실행할 수 있도록 하는 기능입니다.
PEP 517-518에서 정의된 새로운 파이썬 패키징 규격에서는 콘솔 스크립트를 pyproject.toml 파일에 정의하도록 정의하고 있으며 대다수의 파이썬 패키징 도구가 이를 준수하고 있습니다.
콘솔 스크립트가 실제로 실행하는 파이썬 스크립트는 일반적으로 다음과 같은 구조를 가지고 있습니다. 예시로 sample이란 이름을 가진 콘솔 스크립트가 있다고 가정해보겠습니다.
def main():
print('sample 콘솔 스크립트가 실행되면 이 함수가 호출됩니다')
콘솔 스크립트는 파이썬 스크립트에 정의되어 있는 함수를 실행하기 때문에 파이썬 스크립트는 반드시 함수가 하나 선언되어 있어야 합니다.
콘솔 스크립트가 없다면 어떨까?#
일반적으로 파이썬 스크립트를 셸에서 직접 실행하려면 if __name__ == ‘__main__’ 를 추가합니다.
만약 콘솔 스크립트 기능이 파이썬에 없으면 파이썬 스크립트를 실행하기 위해 항상 다음과 같이 명령을 실헹해야 합니다.
$ python sample.py
물론 위 명령을 실행하는 WD(Working Directory)에 sample.py가 있어야 하며 __name__ 이 __main__ 인지 비교한 후에 main 함수를 실행하는 코드가 있어야 합니다.
파이썬 스크립트를 직접 실행하는 방법은 간단하지만 스크립트를 실행하기 위해 항상 WD로 이동해야 한다는 단점은 치명적입니다.
콘솔 스크립트가 있다면?#
파이썬 스크립트 파일을 콘솔 스크립트로 실행할 수 있게 되면 python 명령으로 직접 파일을 실행하지도 않으며 WD의 위치에 영향을 받지 않습니다.
다만, 파이썬 패키지 파일을 파이썬 가상 환경에 설치했다면 콘솔 스크립트도 셸의 실행 환경이 파이썬 가상 환경에 진입해 있어야만 실행 가능하다는 단점이 있습니다.
콘솔 스크립트를 파이썬 가상 환경에 구애받지 않고 쓰고 싶어요#
파이썬으로 개발된 프로그램 중에는 여러 유용한 프로그램이 많습니다. 게중 유명한 것을 나열해보면 다음과 같은 것이 있습니다.
httpie (HTTPie 프로그램의 콘솔 스크립트 버전)
pipenv (파이썬 종속성 관리 도구)
poetry (파이썬 패키징 및 종속성 관리 도구)
certbot (LetsEncrypt 인증서 배포 도구)
이런 프로그램들은 일반적으로 WD에 영향을 받지 않고 어디서든 실행할 수 있는게 좋습니다. 따라서 시스템 전역의 파이썬 환경에 설치하는 것이 좋지만 PEP 668 의 제약이 있어 리눅스의 경우 시스템 전역의 파이썬 환경에 설치하는 것이 권장되지 않는 방식입니다.
PIPX 사용하기#
그래서 pipx가 등장합니다. pipx는 pipsi와 npx에 영향을 받은 CLI 프로그램(콘솔 스크립트) 배포 도구 입니다.
pipx를 사용하면 앞의 httpie나 pipenv 같은 프로그램을 배포하기 위해 파이썬 가상 환경을 만들고 프로그램을 설치한 다음 실행하기 위한 단계가 줄어듭니다.
pipx 설치하기#
pipx를 설치하려면 시스템에 파이썬 인터프리터가 설치되어 있어야 합니다. pipx를 운영체제에 설치하는 방법은 쉽습니다.
대다수 리눅스 배포본은 RPM이나 DEB 파일로 배포되고 있습니다. 윈도우와 맥은 pip 명령으로 설치하면 됩니다.
윈도우에 설치하기#
이 글에서는 윈도우에 pipx를 설치하기 위해 Powershell을 사용합니다.
PS > Invoke-WebRequest -Uri https://bit.ly/4ctb7ek | iex
PS > Invoke-WebRequest -Uri https://bit.ly/3y1qTgL | iex
PS > Add-EnvPath $Env:AppData\$PY_VER\Scripts User
PS > pip install pipx
PS > pipx ensurepath
이렇게 하고 Powershell을 닫았다가 다시 시작하면 pipx 명령을 사용할 수 있습니다.
맥에 설치하기#
맥에서는 단순히 pipx를 설치하고 실행하면 됩니다.
% pip install pipx
% pipx ensurepath
이것으로 설치가 끝납니다.
리눅스에 설치하기 (데비안/우분투 계열 배포본)#
데비안/우분투 계열의 리눅스 시스템이라면 다음 명령으로 쉽게 설치할 수 있습니다.
$ sudo apt install pipx
$ pipx ensurepath
이 방법의 단점은 최신의 pipx 버전이 설치되지 않는다는 것입니다.
리눅스에 설치하기 (레드햇 계열 배포본)#
이 방법은 레드햇 계열(Fedora, CentOS, RockyLinux 등)에 공통적으로 사용합니다.
레드햇 계열 배열 배포본에서는 pipx를 설치하기 위해 epel-release 저장소를 먼저 설치해야 합니다.
$ sudo dnf install epel-release
$ sudo dnf install pipx
$ pipx ensurepath
데비안/우분투 계열과 마찬가지로 레드햇 계열 배포본에서 기본 제공되는 pipx는 과거 버전이 제공됩니다.
리눅스 배포본에 설치되는 pipx 버전이 낮더라도 안심하셔도 됩니다. 리눅스의 경우 새 배포본 버전이 발표되면 pipx 버전도 업그레이드 되기 때문이기도 하지만 배포본에 제공되는 버전은 가장 안정화된 버전이 공급되기 때문입니다.
pipx를 사용해 httpie와 certbot 설치해보기#
pipx를 설치했으니 이제 pipx를 사용해 httpie나 certbot을 설치해보겠습니다. (셸 프롬프트는 편의상 $로 표기하겠습니다)
$ pipx install httpie
$ pipx install certbot
pipx를 사용해 패키지 설치가 끝나면 셸에서 http 명령과 certbot 명령을 실행해보시길 바랍니다.
pipx의 현재 단점이 하나 있는데 한 번에 하나의 명령만 설치 가능합니다. 어떤 파이썬 패키지는 콘솔 스크립트가 여러개 일수도 있는데 pipx는 이런 경우에 파이썬 패키지 파일 내부에 정의되어 있는 모든 콘솔 스크립트를 셸에서 실행할 수 있도록 해줍니다.
마치며#
pipx는 지금까지 살펴본 것처럼 파이썬 패키지 파일에 정의되어 있는 콘솔 스크립트를 우리가 셸에서 WD에 상관없이 사용할 수 있기 때문에 매우 유용합니다.
파이썬 CLI 프로그램을 배포하는 새로운 방법인 pipx! 꼭 한번 사용해보시길 바랍니다.
from. 파이썬 수다장이
Comments
comments powered by Disqus