Skip to main content

pip vs python -m pip

Python 프로젝트나 라이브러리를 설치할 때, 다음 두 가지 방식을 정말 많이 보았으리라 생각된다. 이 두 가지 명령어는 분명 pip을 사용해 패키지를 설치한다. 과연 어떤 차이가 있을까?


pip

pip은 Python용 package installer이다. 이는 PEP 453을 보면, Python 3.4 버전 이후부터는 pip이 default package installer로 포함되게 되었다.


pip install vs python -m pip install

# pip으로 직접 설치
$ pip install <package>

# pip을 python module로 실행 - Unix/macOS
$ python -m pip install <package>

# pip을 python module로 실행 - Windows
C:> py -m pip install <package>

pip을 직접 실행

만약 위와 같이 터미널에서 pip 명령어를 실행하면, pip이라는 installer를 곧바로 실행한다. 하지만 Windows의 경우, pip이라는 명령어를 식별하기 위해 system PATH의 환경변수에 pip의 경로를 추가해야 한다.


pip을 Python module로 실행

만약 위와 같이 터미널에서 python -m pip(Windows의 경우, py -m pip) 명령어를 실행하면, pip을 Python module로 호출하는 것이다. 이는 여러 Python 버전이 존재하는 경우 효율적인데, 특정한 Python 버전을 명시해줄 수 있기 때문이다.

또한 현재 Python에서 권장하는 방식이기도 한데, 이와 관련해, cpython PR을 보면 다음과 같이 그 이유를 설명한다.

I made the assumption that folks are using virtual environments explicitly, rather than diving into the arcana associated with using pip in conjunction with a system Python installation.


pip3 vs pip

그렇다면 이번에는 pip3pip이다.

$ pip install <package>
$ pip3 install <package>

만약 python 2.x.x, python 3.x.x 두 버전이 설치 돼 있다면, 이를 pippip3로 구분해줄 수 있다. 하지만 둘 중 하나만 설치 돼 있는 경우, 해당 버전으로 설치된다.

만약 python 3.x.x 버전만 설치가 돼 있다면, pip은 로컬의 기본 Python Interpreter를 호출하게 된다. 따라서 이땐, pippip3는 동일한 동작을 수행하게 된다. 하지만 이 또한 시스템 설정에 따라 다르기 때문에, 안전하게 사용하려면 pip3를 사용하는 것이 좋다.

로컬에 어떤 pip 버전이 설치 돼 있는지는 다음의 명령어를 통해 확인할 수 있다.

$ pip show pip
Name: pip
Version: 23.1.2
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: distutils-sig@python.org
License: MIT
Location: /Users/seiwonpark/.pyenv/versions/3.9.13/lib/python3.9/site-packages
Requires:
Required-by:


$ pip3 show pip
Name: pip
Version: 23.1.2
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: distutils-sig@python.org
License: MIT
Location: /Users/seiwonpark/.pyenv/versions/3.9.13/lib/python3.9/site-packages
Requires:
Required-by:

나의 경우, python 2.x.x 버전이 설치 돼 있지 않아, 두 가지 모두 동일한 결과(python 3.x.x의 결과)를 보여주었다.


python3 vs python

$ python -m pip install <package>
$ python3 -m pip install <package>

현재 일반적으로 많이 사용되는 Python Interpreter의 버전은 3.x.x이다. 하지만 그 이전엔 Python 2.x.x 버전이 사용되었는데, 이 두 가지 버전이 모두 로컬에 설치 된 경우, 이를 구분하기 위해 pythonpython3가 사용된다. 이는 PEP 453에서 다음과 같이 설명한다.

This means that, for Python 3.3, the most reliable way to invoke pip globally on Windows (without tinkering manually with PATH) will still remain py -m pip (or py -3 -m pip to select the Python 3 version if both Python 2 and 3 are installed) rather than simply calling pip. This works because Python 3.3 provides the Python Launcher for Windows (and the associated py command) by default.


Use Cases

좀 더 이해를 돕기 위한 use case를 살펴보자.

Use Case #1 - 로컬에 python 2.x.x 버전이 설치 돼 있는 경우

터미널에서 python을 실행할 경우, python 2.x.x가 실행된다.


Use Case #2 - 로컬에 python 3.x.x 버전만 설치 돼 있는 경우

터미널에서 python을 실행할 경우, python 3.x.x가 실행된다.


Use Case #3 - 로컬에 python 2.x.x 버전과 python 3.x.x 버전이 모두 설치 돼 있고, Python Path를 환경변수로 설정한 경우

사실 가장 일반적인 경우가 아닐까 생각이 든다. (python 2.x.x 버전이 없는 경우 포함) 보통 Python의 버전을 관리하기 위해 pyenv, conda 등의 도구를 많이 사용한다. 이런 경우, Python의 PATH를 설정하기(혹은 하도록) 마련이다.

나의 경우, pyenv로 Python의 버전을 관리하고 있고, 로컬에서 실행하면 다음과 같은 결과를 확인할 수 있다.

$ which python
/Users/seiwonpark/.pyenv/shims/python

$ which python3
/Users/seiwonpark/.pyenv/shims/python3

하지만 여전히 python 2.x.x 버전이 설치 돼 있지 않아, 두 경우 모두 동일한 3.x.x 버전을 실행했다.


내가 권장하는 Practice

그래서 결국 하고싶은 말이 이거였다.

로컬 환경에 따라 python 2.x.x 버전과 python 3.x.x 버전이 모두 있을 수 있고, 시스템의 기본 Python Interpreter의 설정은 제각각 다르다. 따라서 pip 대신 python -m pip을, python -m pip 대신 python3 -m pip을 사용하자.

Related Links