pipx란?
pipx는 Python으로 작성된 최종 사용자 애플리케이션을 설치하고 실행하는 데 도움을 주는 도구입니다. 대략 macOS의 brew, JavaScript의 npx, 그리고 Linux의 apt와 비슷합니다.
https://github.com/pypa/pipx?tab=readme-ov-file
pip와 밀접한 관련이 있으며, 실제로 pip를 사용하지만, 주로 명령줄에서 직접 애플리케이션으로 실행할 수 있는 Python 패키지를 설치하고 관리하는 데 중점을 둡니다.
pip와의 차이점 🔥
pip는 환경 격리 없이 라이브러리와 애플리케이션 모두를 위한 범용 패키지 설치 도구입니다. pipx는 애플리케이션 설치를 위해 특별히 만들어졌으며, 격리를 추가하면서도 여전히 애플리케이션을 쉘에서 사용할 수 있게 해줍니다. pipx는 각 애플리케이션과 관련 패키지에 대해 격리된 환경을 만듭니다.
pipx는 pip에 포함되어 있지 않지만, 시스템을 부트스트랩하는 중요한 과정 중 하나로 자주 설치됩니다.
주요 기능 🔥
pipx는 다음을 가능하게 해줍니다:
- install 명령을 사용하여 격리된 환경에 설치된 패키지("apps")의 CLI entrypoints를 노출합니다. 이를 통해 의존성 충돌 없이 깨끗하게 제거할 수 있습니다!
- pipx로 설치된 패키지를 쉽게 목록화하고, 업그레이드하고, 삭제할 수 있습니다.
- run 명령을 사용하여 최신 버전의 Python 애플리케이션을 임시 환경에서 실행할 수 있습니다.
무엇보다도, pipx는 일반 사용자 권한으로 실행되며 절대 sudo pip install을 호출하지 않습니다.
pipx의 작동방식
Linux에서 패키지와 해당 바이너리를 설치할 때 (pipx install package), pipx는 다음을 수행합니다:
- ~/.local/share/pipx/venvs/PACKAGE 디렉토리를 생성합니다.
- ~/.local/share/pipx/shared/에 공유되는 패키징 라이브러리 pip을 포함한 공유 가상 환경을 생성하거나 재사용합니다.
- 라이브러리가 최신 버전으로 업데이트되었는지 확인합니다.
- 위에서 언급한 공유 pip을 사용하지만, 그 외에는 격리된 가상 환경을 ~/.local/share/pipx/venvs/PACKAGE에 생성합니다. (pipx는 이를 위해 .pth 파일을 사용합니다.)
- 원하는 패키지를 가상 환경에 설치합니다.
- ~/.local/bin에 새로운 바이너리들이 가리키는 심볼릭 링크를 생성합니다. 예를 들어, ~/.local/bin/black -> ~/.local/share/pipx/venvs/black/bin/black처럼 생성됩니다.
- 새로운 매뉴얼 페이지들이 가리키는 심볼릭 링크를 ~/.local/share/man/man[1-9]에 생성합니다. 이는 ~/.local/pipx/venvs/PACKAGE/share/man/man[1-9]에 있는 새 매뉴얼 페이지를 가리킵니다.
- ~/.local/bin/이 PATH에 포함되어 있는 한, 새로운 바이너리들을 전역에서 사용할 수 있습니다.
- man 명령을 지원하는 운영 체제에서, ~/.local/share/man이 man 명령의 검색 경로에 포함되어 있으면, 새로운 매뉴얼 페이지를 전역에서 확인할 수 있습니다.
- pipx 명령에 -global 플래그를 추가하면, 해당 동작이 전역 범위에서 실행되어 앱이 모든 사용자에게 노출됩니다. 참고로, 이 기능은 Windows에서는 사용할 수 없습니다.
바이너리를 실행할 때 (pipx run BINARY), pipx는 다음을 수행합니다:
- 공유 패키징 라이브러리 pip이 포함된 공유 가상 환경을 생성하거나 재사용합니다.
- 라이브러리가 최신 버전으로 업데이트되었는지 확인합니다.
- 실행의 재현성을 보장하는 속성들의 해시값을 기반으로 이름이 지정된 임시 디렉토리(또는 이 패키지에 대한 캐시된 가상 환경)를 생성하거나 재사용합니다. 여기에는 패키지 이름, spec, python 버전, pip 인자 등이 포함됩니다.
- 그 안에 python -m venv로 가상 환경을 생성합니다.
- 원하는 패키지를 가상 환경에 설치합니다.
- 바이너리를 실행합니다.
이 모든 것은 사용자가 직접 할 수 있지만, pipx가 이를 자동화해 줍니다. pipx가 내부에서 무슨 일을 하고 있는지 궁금하다면, --verbose 플래그를 추가하여 실행되는 모든 명령과 인자를 확인할 수 있습니다.
설치
On macOS
brew install pipx
pipx ensurepath
sudo pipx ensurepath --global # optional to allow pipx actions with --global argument
On Ubuntu
sudo apt update
sudo apt install pipx
pipx ensurepath
sudo pipx ensurepath --global # optional to allow pipx actions with --global argument
Using pip
python3 -m pip install --user pipx
python3 -m pipx ensurepath
sudo pipx ensurepath --global # optional to allow pipx actions with --global argument
예제
pipx를 사용하여 패키지 및 해당 애플리케이션 설치
다음을 실행하여 애플리케이션을 전역적으로 설치할 수 있습니다.
pipx install PACKAGE
이 작업은 자동으로 가상 환경을 생성하고, 패키지를 설치하며, 패키지와 연관된 애플리케이션(엔트리 포인트)을 PATH에 추가합니다. 예를 들어, pipx install pycowsay를 실행하면 pycowsay 명령을 전역에서 사용할 수 있게 되지만, pycowsay 패키지는 자체 가상 환경에 격리됩니다. pipx는 이를 위해 절대 sudo로 실행할 필요가 없습니다.
>> pipx install pycowsay
installed package pycowsay 2.0.3, Python 3.10.3
These apps are now globally available
- pycowsay
done! ✨ 🌟 ✨
>> pipx list
venvs are in /home/user/.local/share/pipx/venvs
apps are exposed on your $PATH at /home/user/.local/bin
package pycowsay 2.0.3, Python 3.10.3
- pycowsay
# Now you can run pycowsay from anywhere
>> pycowsay mooo
____
< mooo >
====
\\
\\
^__^
(oo)\\_______
(__)\\ )\\/\\
||----w |
|| ||
패키지 주입(Inject a package)
pipx로 설치한 애플리케이션에 추가 패키지가 필요한 경우 pipx inject를 사용하여 추가할 수 있습니다. 예를 들어 ipython이 설치되어 있고 여기에 matplotlib 패키지를 추가하려는 경우 다음을 사용합니다.
pipx inject ipython matplotlib
명령줄에서 패키지를 모두 지정하거나 한 줄에 하나의 패키지 또는 조합하여 텍스트 파일에 나열하여 여러 패키지를 삽입할 수 있습니다.
pipx inject ipython matplotlib pandas
# or:
pipx inject ipython -r useful-packages.txt
임시 가상 환경에서 애플리케이션 실행
이것은 pipx install의 대안입니다.
pipx run은 위에서 언급한 Python "앱"들을 일회성 임시 환경에서 다운로드하고 실행하며, 실행 후에는 시스템에 아무런 영향을 주지 않습니다. 이는 앱의 최신 버전을 실행해야 하지만 컴퓨터에 설치하고 싶지 않을 때 유용할 수 있습니다.
예를 들어, 새 프로젝트를 시작하면서 적절한 디렉토리 구조를 설정하고 싶을 때, 애플리케이션의 도움말을 보고 싶을 때, 혹은 단순히 특정 상황에서 앱을 한 번 실행하고 시스템에 아무런 흔적을 남기지 않고 싶을 때 사용할 수 있습니다.
또한, pipx run은 항상 최신 버전을 자동으로 실행하므로 앱을 업그레이드해야 할 필요성을 잊지 않아도 된다는 장점도 있습니다.
pipx run APP [ARGS...]
그러면 격리된 임시 디렉터리에 패키지가 설치되고 앱이 호출됩니다.
> pipx run pycowsay moo
---
< moo >
---
\\ ^__^
\\ (oo)\\_______
(__)\\ )\\/\\
||----w |
|| ||
앱을 실행하기 위해 설치 명령을 실행할 필요는 없습니다.
애플리케이션 이름 뒤의 모든 인수는 애플리케이션에 직접 전달됩니다.
> pipx run pycowsay these arguments are all passed to pycowsay!
-------------------------------------------
< these arguments are all passed to pycowsay! >
-------------------------------------------
\\ ^__^
\\ (oo)\\_______
(__)\\ )\\/\\
||----w |
|| ||
'개발 > Python' 카테고리의 다른 글
Non-ASCII character 에러 (0) | 2017.03.31 |
---|---|
.data 파일을 .json 파일로 변환 (0) | 2017.03.21 |